Aikの技術的な進捗部屋

技術的な進捗とか成果とかを細々と投稿するブログです。時々雑記も。

巷で噂?のCoinhiveについて

今話題?のCoinhiveについて調べてみました

先日自分の学校で『Coinhive』に関するLT(Lightning Talk)がありました。
どうやら数日前にこの話は話題に上がっていた様で、Coinhiveに関するまとめ記事が結構出てきました。

ただまぁ…うん、賛否両論あってなおかつ否定的な意見が多い話題からか、
Coinhive=害悪』という風にCoinhiveに関して碌に説明しないまま悪と決めつける記事も散見されました。

私としては、Coinhiveは良い仕組みだし、今は収益率も低いですが発展していけばそのメリットも大きくなると思っています。
というかCoinhive自体のもたらすメリットを知ってしまうと、無闇にCoinhiveが淘汰される姿を見るのは残念極まり無さすぎて…。

このため、同志を増やすという意図で、私がどうしてCoinhiveが良いと思うかとか、Coinhiveのメリットとかを述べていければなと思います。
十分に調べて記事を書いたつもりですが、もし間違った記述等あればご指摘いただけると幸いです…。

※あと今回の記事はめちゃくちゃボリュームあります!すみません簡潔にまとめられなかったんですなんでもしません許して(ry

そもそもCoinhiveとは

Coinhiveは仮想通貨マイニング手法の1つとして提供されているサービスです。
その前に『仮想通貨マイニング』に関して説明しましょう。

仮想通貨マイニングとは?

仮想通貨マイニングを説明するには、仮想通貨の仕組みを理解しなければなりません。
ただ、この辺りの説明を本気ですると、とっても長くなるので…。
今回の記事では具体的な仕組みではなく本質のみを分かりやすく説明されていた記事より引用、という形で説明させていただきます。

ビットコインを始めとする仮想通貨は、通貨の信用の基盤として計算量を利用しているものがほとんどです。
例えば日本円は、日本銀行の信用によって通貨の発行が行われているのですが、
仮想通貨の場合は通貨の発行にコンピュータの計算力が必要になり、計算力をたくさん用意した人がより多くのコインを得られる仕組みです。
簡単に言うと、CPUをたくさんぶん回すと仮想通貨が手に入ります。

例えばビットコインの採掘で収益をあげようと思うならば、電力の安い中国でビットコイン専用にチューニングされたコンピューターをブンブン回すのが一般的です。
ところが、Coinhiveは「普通のユーザーのCPUの力を利用して仮想通貨を採掘する」のが大きな違いです。
参考記事: ブラウザで仮想通貨を採掘するサービス "Coinhive" について

もちろん仮想通貨マイニング自体は個人の規模でも出来ます。
ただ、仮想通貨マイニングに必要な計算量はかなり膨大であるため…。
本気で儲けようとするなら、上記引用文の様に電気料金が安い国で、十分な性能を持ったコンピューターを使用する必要があります。
仮想通貨マイニングでググれば、実際にパソコンを仮想通貨マイニング専用にカスタマイズして運用した記事等が結構出てくるので、興味の出た方は是非。

改めてCoinhiveとは

安い電力やチューニングされたコンピュータがしのぎを削っている世界で、普通のユーザーが採掘に参加してもほとんど利益は得られず、電気代で赤字になる可能性すらあります。
しかし、大きなWebサイトの来訪者全員が僅かばかりでも採掘をしてくれれば、それをすべて合わせるとそこそこの金額になることが期待出来ます。
それを簡単に実現してくれるのが、今話題になっているCoinhiveのサービスなのです。

Coinhiveは、非常にシンプルで使いやすいAPIを提供しています。
会員登録をして数行のJavaScriptコードをWebに貼るだけで、すぐに来訪者による採掘が可能になります。
Coinhive自体は、採掘量の3割を手数料として取るビジネスモデルです。
現在JavaScriptで提供されたAPI群ばかりが話題になっていますが、この仕組みはWebサイトだけではなく、ゲームなどのアプリでも利用可能です。
参考記事: http://nmi.jp/2017-10-10-About-coinhive

上記引用文にもある様に、Coinhiveは一種のWebAPIです。
Coinhiveの利用者は、主にWebサイトやWebサービスの運用者となります。

このAPIを使えば、広告に頼らない新たな収益モデルを確立する事ができます。
具体的な流れとしては、

  1. 運用者が自身のWebサイト/WebサービスCoinhiveAPIを設置
  2. サイト閲覧者やサービス利用者のCPU処理能力を借りてマイニング
  3. Coinhiveから利用手数料を差し引かれた収益を得る

といった形でしょうか。

Coinhiveを使用するメリットとは?

先の項目で述べた様に、Coinhiveを利用すれば広告に頼らない新たな収益モデルを確立できます。
Coinhive側の思想にも「広告に頼らない新たな収益モデルとしてこのCoinhiveを…」というスタンスでもあるそうです。

広告が嫌いな利用者からすれば邪魔な広告が消えるため、かなり有用だとは思います。

Coinhiveの問題点

Coinhiveの問題点の一つが「利用者の同意なしにCoinhiveで仮想通貨マイニングさせられてしまう」事。
言い換えれば「利用者の同意なしに勝手にCPUを使われる」ということです。
CPUが使われるタイミングによっては、パソコンが重くなる事も。
(具体的に言うと、CPU使用率が100%を越えた状態がずっと続くとパソコンが重くなるので…)
その辺りをどう思うかが問題になってくると思います。

実際、かなり大手のWebサービスが利用者に何も伝えないままCoinhiveを導入し、そのサービスのフォーラムが炎上した事例もあるため…。
使用に際してはかなり注意を払わないと大変なことになりそうです。

※サイトやサービス側が「我が社のサイト/サービスは無料で閲覧/利用出来ますが〜」と注意書きをしっかりすれば良いのでしょうが…。
広告と違って簡単に理解してもらえにくいので、ちょっと敬遠されそうだなとは思います。

もう一つが「現段階では収益率がものすごく低い」こと。
これも具体例を挙げて説明されてた記事がありましたので、そちらから引用させていただきました↓

さて、大事なのは「これがどの程度のお金になるのか」ということです。
まず明確にしておきたいのですが、現状では広告に比べて全くお金になりません。
具体的にどの程度の収益になるのかを示しましょう。

自分のMacBook Pro(Mid 2015, 2.5 GHz Intel Core i7)で1時間Webページに滞在して、0.000029XMR(Moneroの単位)の採掘でした。
XMR-USDの取引レートは記事執筆時点で約$90//XMR、USD-JPYが¥113/USDですので、記事執筆時点では1時間の採掘で日本円で約0.29円になります。
1PVで滞在時間を3分と多めに見積もっても、0.0145円/PVとなり、いわゆるバナー広告の方が何倍もマシということになります。
参考記事: http://nmi.jp/2017-10-10-About-coinhive

また、仮想通貨マイニングはマイニングする仮想通貨の価値によって儲け額が全然違ってくるのも大きな問題です。
今月と先月で閲覧数/利用数は同じなのに、仮想通貨の価値の差異で収入に大きく差がついてしまいます。
このため、常に安定した収益が見込めないというのも問題点ですね。
もっと仮想通貨が流通したりすれば話は変わってくるのでしょうが…。

※また、インターネット環境がないと計算してもらった結果を送信できないので、オフライン環境下では全く収益にならないというのも問題点かと…。

Coinhiveが良いと思う理由

私がCoinhiveが良いと思った理由は

  • 広告収益モデルに代わる、新たな収益モデルが生まれる

これに尽きます。

今のご時世無料で記事を見れたり、サービスを使える様にはなりましたが…。
そこに企業が絡んでいるのであれば、完全に無料で使えるわけではないのです。どこかしらで利益を得る必要があります。
このため、提供するサービスの機能を制限したり、一定期間しか使えなかったり、広告の表示が義務付けられたり、手数料を取られたり…と、様々な収益モデルが誕生しました。
企業は利益を追求するので当然といえば当然ですし、そのお陰で有益な情報が得られたり、便利なサービスが利用できるのであれば安いものです。

ただ、現状…特にまとめサイト運営やブロガーの収益モデルは大概が広告モデルになってます。
そしてこの広告収益モデルによって生み出された害は様々…。
PV数を稼ぐために分かりやすい話題にとにかく飛びつき、低品質な記事が出来上がったり、無断転載だらけのまとめサイトやゲーム攻略サイトが出来上がってしまったり…。
これは現状の収益モデルが「広告収益モデル」だけしか無いということが原因で発生していると思うのです。

もしCoinhiveの様なAPIを利用した収益モデルが確立されれば、

  • 広告収益モデルによって生まれる低品質な記事やまとめサイトの撲滅
  • 広告主=スポンサーに頼らず自分たちで利益を生み出せる
  • ユーザー側に視覚的な鬱陶しさを生み出さず、快適にサイト内を閲覧/サービスの利用ができる

など様々な良い面が生まれるのでは無いかと思います。
最もそれには「Coinhiveの様なAPIを用いた収益モデルの一般認知度向上」「仮想通貨マイニング技術の向上(現状全然儲からないし…)」など、解決すべき点はたくさんあると思います。
でもこれらが解決できれば、Webサイト/Webサービス運営者は従来の広告収益モデルだけでなく、別の選択肢も選べる様になるのです。

これらのメリットを踏まえて、Coinhiveが悪いか良いかを議論すると、きっと違う答えが出てくると思うのです…!
あわよくば、その答えが「Coinhiveの様な技術を発展させる」方向に向いていれば…と。

参考記事紹介

今回の記事執筆にあたり、参考になった記事をいくつかまとめてみました。
※正直今回の記事で、Coinhiveについてあまり詳しく語れなかったかなと思ってて…。
もし興味が出たら是非!是非下記の記事を読んでみてください…!

記事によってはそれなりの予備知識を要求されますが、読みやすい記事もあったので…。
Coinhiveの技術的な話よりも、倫理的な問題点に焦点を当てた記事も多かったので、そう言った記事なら読むのが苦にはならないはずです。

話題の「Coinhive」とは? 仮想通貨の新たな可能性か、迷惑なマルウェアか - ITmedia NEWS
こちらはCoinhiveの概要やCoinhiveの持つ問題点についてまとめてあります。
分かりやすく書かれていますし、そこまで長い記事でもないので、Coinhiveに関して調べる際に最初に読む記事としては良いかもしれません。

仮想通貨マイニング(Coinhive)で家宅捜索を受けた話 - Webを楽しもう「ドークツ」
Coinhive利用者側の視点で、どの様にCoinhiveを利用されたか、また警察からどの様な取り調べを受けたかを詳細かつ丁寧に書かれてあります。
筆者もこの記事をきっかけにCoinhiveに関して興味を持ちました。

Coinhiveとその周りの攻防を解説するよ – shotaro akiyama – Medium
こちらの記事はCoinhiveの仕組みや概要もそうですが、それと合わせてCoinhiveの様々なブロック方法やそのブロック方法をくぐり抜ける方法の紹介、さらにはCoinhiveとその同種のサービスをまとめてブロックできる方法を提示されてます。
なかなか面白い記事だと思うので、Coinhiveに関して興味が湧いた方は読んでみると良いかもです。
また、この記事を書かれた方がCoinhiveに対して持っている意見について書かれた記事もありましたので、合わせてどぞう|д゚)つ
僕がCoinhiveに期待すること – shotaro akiyama – Medium

人気サイトがアクセス数の多さを利用し閲覧者のCPUパワーで仮想通貨マイニング、広告に代わる収入源になるか? - GIGAZINE
こちらはGIGAZINEさんの記事で、Coinhiveを利用者に無断で自社に導入していたサイトの炎上〜サイト側の対応が記載されてあります。
他にもこういった、利用者に無断でCoinhiveを導入していた事例は結構あるみたいです…。

ブラウザで仮想通貨を採掘するサービス "Coinhive" について
Coinhiveの概要から問題点、実際に利用してみた結果やCoinhiveのメリットについて書かれてあります。
今回の記事を書くにあたり、大いに参考にさせていただきました…!

余談 友人の私見

Coinhiveに関して友人と話した際「Coinhiveに関してやたらと叩くというか、碌に説明もせずに一方的に悪と決めつける記事が多い」という話題に。
私が「なんでこういうふうな記事が多いのだろう…」と呟いた所、友人が

「広告収益モデルで稼いでいて、他の収益モデルに変更するのが困難な企業、もしくは明確なスポンサーがいる企業だったら、そりゃあ新たな選択肢なんて流行ってほしく無いと考えるでしょう」

と話してくれました。なるほど確かに…。
でも個人的には今回のCoinhiveを用いた収益モデルが出来ても、両者は明確に違うところがあるので…。
※広告モデルは利用者の視覚体験を阻害する一方、Coinhiveの様なAPIを使ったモデルは利用者のCPU処理能力を借りる。
競合はせずに両者とも共存すると、私は思います…。
(ちなみに友人も同意見でした)

LaTeXのはじめ その3

前前回LaTeX自体について調べたり、その導入について書きました
前回LaTeXのざっくりとした書き方について書きました

※今回は特に前回からの続き要素が強めです。

LaTeXを使ってて気づいた事

前回LaTeXのざっくりとした書き方をまとめました。
今回は、LaTeXを使ってみて気づいた事(つまづいた所や気をつけた方がいい事も)をまとめておきます。
何かのお役に立つかも?

コメントについて

コメントアウトは、1行形式と複数行形式(パッケージ読み込みが必要)が使えます。
1行形式なら行の先頭に%
複数行なら\usepackage{comment}でパッケージを読み込み、

\begin{comment}
コメントアウトしたい文
\end{comment}

と書けばOKです。

改行について

LaTeXで改行をするのは、ちょっと面倒くさいです。
((とは言っても、考え方はMarkdownと一緒の様なものですが…。

まず、LaTeXで普通に改行をしたい場合は、\\(バックスラッシュ2個)を入れればOKです。
例えば下記の様なコードだと、

hoge\\fuga

コンパイルするとこの様に表示されます。

hoge
fuga

しかし、コード内で例えば

hoge

fuga

こう言った形で書いても、

hoge
fuga

この様に表示されます。
但し、1行目と2行目の行間は↑よりも広いです。
どうしてこうなるかと言うと、LaTeXでは1行開けると「段落が変わった」扱いとなるからです。
なので\\の改行よりも、行間は少し広めに取られるんですな。

同じ段落扱いで改行したい時は\\を使いましょう。
(Markdown記法と感覚的には一緒かな?)

太字や斜体等について

太字にするには\textbf{太字にしたい文字}を、斜体にするには\textit{...}を使います。

と思ったの…ですが、少し調べると斜体にするコマンドは正確には「イタリック体」にするコマンドでした。
イタリック体は英語文字に存在する概念らしく、「イタリック体」と「斜体」は別物として扱われる様です。
※日本語におけるイタリック体にまつわる記述が載った、面白い記事がありました↓
日本語のタイポグラフィにおけるイタリック体と斜体について

ここで、「イタリック体は英語文字にしかない概念だとするならば、日本語に対して\textit{...}を使っても効果は無いのか?」と思い、実験してみました。
結果…。
LaTeXでtextitコマンドを用いれば斜体文字になるか試してみた結果

予想通り斜体にはなりませんでした。やっぱり。
ちなみに斜体にするにはどうするか調べましたが、マクロを用意したり専用フォントを用意してあげないと無理そうです…。

なお、この太字にするコマンドやイタリック体にするコマンドは、非推奨のコマンドもあるそうです。
対応表等も載った詳しいサイトはこちら(TeX入門)
私が使おうとした輪講資料テンプレートにも、しっかり非推奨コマンドがありました…こう言うのも気をつけないとね!

特殊文字について

どうやらLaTeXには、普通に記述できる記号と出来ない記号がある様で。
普通に記述出来ない記号としては &{}#_ など、LaTeX記法では別の目的として使う記号が該当しております。
当然と言えば当然ですね…。

もしこういった記号を記述したい場合は、それ専用の記述が必要です。
上記に挙げたものであれば、記号の前に\(バックスラッシュ)を置いて記述すればOKらしいですが…。
他にも色んな記述方法があるみたいなので、気になった場合はLaTeX 特殊文字で調べてみるといいかも。

ちなみに私は&を普通に書いてたせいでコンパイルが通らず、小1時間ほど格闘しました(血涙)。
入門サイトを読むって大事ですね。

TeXにおけるフォント変更について

TeXで使用する文字のフォントを変更するにはどうすればいいのかな」とふと思い、調べてみました。
デフォのフォントが凄く綺麗なので、無理に変更する必要も無いんですけどね。

調べた結果、TeXでのフォント変更は非常に困難なことがわかりました。
参考記事(TeX入門)
どうしてそうなったのかと言うと(参考記事の文書をまとめてみました)、

TeX開発当時は今のTrueTypeフォントみたいな形式が広まっておらず、TeXみたいな高度なものに耐えうるフォント形式もなかった」
→「無いなら作っちゃえばいいじゃない。TeXで読み込める独自形式のフォントファイル(TFMファイルを作ろう」
→「あれいつの間にかTrueTypeフォントっていう規格のフォントファイルが流行してるぞ」
→「俺らが作ったTFMファイルの方がマイナーになっちゃったお…」
→「TFMでフォント配布してるとこなんて全然ないお…これじゃないとTeXでフォント変更できないのにぃ…」

って感じです。悲しい…。
ただ、個人で作成されたものやGoogleAdobeが提供しているものもあるみたいです。
頑張れば自分でもTFMファイルは作れるとのこと…でも中々骨が折れそうな作業っぽいです。

一覧表の更新(mktexlsr)について

覚えておくとつまづき防止になりそうだったのでメモ。
自分で参考記事をまとめようかと思いましたが、参考記事の記述がすごく良かったので引用という形で残しておきます。

LaTeXがファイルを読み込むときはTeXディレクトリの中から目当てのファイルを探しますが,
ファイルを探すのはそれなりの時間がかかります。
そこで考え出されたのが「あらかじめファイルの一覧表を作っておき,ファイルを探すときにはそれを参照する」
という仕組みで,この一覧表(ls-R)を作るコマンドがmktexlsrです。
手元のシステムでこの一覧表を利用しているかどうかはls-Rというファイルが存在するかどうかを調べるとわかります。

TeX Liveでは,このls-Rという一覧表でファイルを管理しています。
このため,新しいパッケージなどをインストールするたびに一覧表を更新してやらないと,
せっかくインストールしたつもりのパッケージもLaTeXから見つけてもらえずに使用できません。
TeX Liveでパッケージを追加した場合は
mktexlsr
を実行して一覧表を更新しましょう。
Unix系であれば管理者権限が必要ですので,
sudo mktexlsr
として実行します。
参考記事(TeX入門)

長さの単位について

LaTeXでは、長さの単位として下記のものを使えるそうです。
まとめてあった記事があり、その記事より引用させていただきました。
※引用文中では表組みが使えなかったので、こういう表示となりました…申し訳ありません。

medemanabu.net

単位 概要 補足
pt ポイント 1 pt = 1/72.27 in
in インチ 1 in = 25.4 mm = 2.54 cm
mm ミリメートル 1 mm = 0.1 cm
cm センチメートル 1 cm = 10 mm
pc イカ 1 pc = 12 pt
bp ビッグポイント 1 bp = 1/72 in = 0.3527 mm
sp スモールポイント 1 sp = 1/65536 pt
ex 欧文フォントの高さ
em 和文フォントの幅

ページ番号の消去法について

LaTeX文書はデフォルトでページ番号がくっついてきますが、ページ番号を消去したい場合もあると思います。
全部のページ番号を消去する場合は\pagestyle{empty}コマンドを、
特定のページ番号を消去する場合は\thispagestyle{empty}コマンドを用います。

なお、この\pagestyleコマンドですが、引数(上記の場合だとemptyにあたる部分です)を変更する事でページ番号周りの設定も出来るそうです。
詳しくは下記記事を。ページ番号の形式の変更が出来るコマンドの紹介もあります。
www.latex-cmd.com

パッケージ「titlesec」について

研究室の輪読資料テンプレートにしれっとある「titlesec」というパッケージについて調べてみました。
※公式の配布サイトはこちら(英語です)

こちらのパッケージを使うと、見出しの形式や修飾が簡単に行える様になるそうです。
色んなレイアウト例をまとめておられるサイトもあり、そちらを見るとかなりオシャレなレイアウト等も簡単に出来るみたいです…すごい。
参考サイト

ちなみに輪読資料テンプレートでは…よく分からない使い方をしてありました。
「これここの部分消しても問題なくね…?」と思って消してみたら、案の定変化は無かったです。
いったいあの箇所で何をしてたんだ…。
参考までに、該当箇所のソースコードを載せておきます。

\usepackage{titlesec}
\titleformat*{\section}{\large\bfseries}
\titleformat*{\subsection}{\normalsize\bfseries}
\titleformat*{\subsubsection}{\normalsize\bfseries}

今後について

一先ずLaTeXについては満足いく所まで調べられましたので…。
もし他にも気づいた事等ある際は、別の記事にまとめると思います。

LaTeXのはじめ その2

前回LaTeX自体について調べたり、その導入について書きました
次回LaTeXコメントアウト法や小ネタなどについて書きました

LaTeXerに、俺はなる!

研究室の輪読用に作る資料作成のため、LaTeXを使う事に。
前回から環境構築までは終わりました。

そして、輪読用の資料作成ですが…ぶっちゃけテンプレートがあるので、該当箇所だけ変えれば済む話ではあります。
でも、せっかくLaTeXを触れるんだし…と言う事でLaTeXに関して少し勉強する事にしました。
※どうやらうちの大学では卒論はtex形式で提出するらしいので、どっちにしろ避けられない道ではありますしね。

LaTeXについて、いつもの様に学んだ事やつまづいた事等を下記に備忘録がわりに記したいと思います。

ざっくりとした書き方

基本的なLaTeXの構造としては、下記の様になるそうで。

\documentclass[オプション]{文書クラス}
プリアンブル
\begin{document}
LaTeX 本文
\end{document}

…何やら見慣れない用語が連立してます。
1個ずつ見ていきましょう。

\documentclassについて

\documentclassには、「オプション」と「文書クラス」というものを指定できます。

文書クラスとは「論文(article)」「本(book)」「報告書(report)」といった文章の種類(フォーマット)のことで、
例えば「和文の論文を書きたい!」と言った場合は文書クラスにjarticleまたはjsarticleと書けばOKとの事。
jarticleは従来の和文論文形式、jsarticleは新しい和文論文形式を指します。

オプションには文字サイズの大きさや用紙サイズ、文章を2段組にすると言った様々な事が指定可能で、
中には用紙の向きを横向きに、と言ったことも…横向きなんてデフォで設定出来るんですなぁ。
デフォルトでは、

  • 文字サイズ: 10pt
  • 用紙サイズ: A4
  • 論文(article)と報告書(report)では、奇数/偶数ページは同じレイアウト
  • 本(book)では、奇数/偶数ページは違うレイアウト
  • 数式は中央寄せ表示
  • 数式番号は右寄せ表示

といった形になっているみたいです。
尚、文書クラスによって指定できる文字サイズは異なるみたいです…。

プリアンブルについて

プリアンブル領域では「ページのレイアウト」や「パッケージの読み込み」「タイトル等の設定」を行います。

ページのレイアウト

ページのレイアウトでは、ページの余白部分の大きさ等を指定できます。
とは言っても、デフォルト設定で十分いい感じに余白等を作ってくれるので…。
あんまりここをいじる必要は無いかもですね。

パッケージの読み込み

LaTeXには様々なパッケージがありますが、それらの読み込みはここで行います。
パッケージは、「拡張機能」という認識でいいのかな?
TeX入門によると、

LaTeX の機能を拡張したり,新たな機能を追加したりするために用いるもの

だそうです。
もちろん、自作のパッケージを作って読み込む事も可能だそうです。
個人的には、こういう機能を提供してくれてるのすっごく嬉しいんですよねぇ…。
(有志の方々が作られた色んな拡張機能を使って遊べるからね!)

ちなみに、私の研究室の輪読資料テンプレートには「titlesec」というパッケージが読み込まれてました。
こちらについては次の記事に調べた事を書きます。

タイトル等の設定

「タイトル」「著者」「日付」の設定もここで行います。
尚、ここではあくまで設定しか行いません。
出力をするには、本文領域に\maketitleと書きましょう。

参考までに簡単な設定をしたLaTeXファイルのサンプルを置いときます。

\documentclass{jsarticle}

% プリアンブル
\title{タイトル}
\author{著者名1 \and 著者名2}
\date{2009/05/24}

% 本文
\begin{document}
  \maketitle % タイトル等を表示
\end{document}

プリアンブルについて- 補足

輪読資料テンプレートのプリアンブルをよく読むと、\setlength{\textheight}{\paperheight}や、
\addtolength{\textheight}{-\topmargin}と言ったものも設定されてありました。
気になって調べてみると、どうやらこれらは「ページレイアウトパラメータ」と言うものを設定してあるそうです。

ページレイアウトパラメータについて

ページレイアウトパラメータというのは、例えば「本文領域の高さ」や「ヘッダ領域の高さ」など、レイアウト面を司るパラメータの事だそうです。
そして、\setlengthというのはこのパラメータに値を設定するコマンドの事で、

\setlength{パラメータ}{設定値}

と言った形式で記述します。
また\addtolengthはパラメータに数を追加するコマンドで、

\addtolength{パラメータ}{追加したい分の値}

と言った形式で記述します。
ページレイアウトパラメータでは色んな部分を指定する事が可能(2段組をした時の左右2つのカラムの間隔とか)なので、気になった方は調べてみて下さい。 参考記事

本文について

いよいよ本文領域についてです。
こちらでは、「実際に文書に出力される部分」を記述します。

本文領域は、下記の様に\begin{document}\end{document}の間に記述されるものです。

\begin{document}
LaTeX 本文
\end{document}

本文領域に記述できる事はたっくさんあります…というか文章の中身を記述するわけですからね。
ここで触れるのはやめておきます。
詳しく見たい方は、下記のサイトを参考にするといいかもです。ジャンル毎にコマンドがまとめられてるため、大変探しやすいです。
www.latex-cmd.com

ざっくりとした書き方については以上です。めちゃくちゃ長くなった…。

次の記事へ…

LaTeXを使ってみて気づいた事(つまづいた所や気をつけた方がいい事も)をまとめてみましたが、ここまでで結構な文量になったので…。
一度ここで分けたいと思います。

次の記事には、例えばコメントの書き方や特殊文字の書き方等の基本的な所や、ページ番号の消去法等のもっと細かい所についてを書いてあります。
※上の方で出てた「titlesec」についても書いてます。
LaTeXについて興味がある人は覗いてみると面白い事が書かれている(かも)しれません。

LaTeXのはじめ

次回LaTeXのざっくりとした書き方について書きました
次々回LaTeXコメントアウト法や小ネタなどについて書きました

LaTeXを使う事になりました

大学で輪読資料を作成するため、LaTeXを使う運びとなりました。
「え、マークダウンじゃダメ?」と思いましたが、輪講資料はタイトルや輪講発表者名以外は2カラムで書かれており…。
これをマークダウンでやるには何となく骨が折れそう(と言うか出来んの?状態)だったので、大人しくLaTeXにする事に。

LaTeXは名前だけ聞いていた状態でしたが、知人がレポートに使用している姿を見て便利そうだなとは思ってたので…。
これを機に使ってみようと思います。

まずLaTeXとは何ぞや

と言う事で調べてみました。
Google先生より飛んだ、下記参考記事を見て勉強…。
参考記事(TeXとLaTeXの違い)
参考記事(Wikipedia-LaTeX)
参考記事(Wikipedia-TeX)
参考記事(LaTeX入門)

私なりにざっくりと調べたことをまとめてみましたので、忙しい方は下記をどうぞ↓

LaTeX説明前に

LaTeX(ラテフ)について説明するには、TeX(テフ)についてまず説明せねばなりません。
(と言うのもLaTeXTeXの中に属してあるからです)

TeXとは

TeXは1978年にドナルド・クヌースという数学者が発表した組版システムです。
組版: 文字や図版などの要素を配置し、印刷用の紙面を構成すること

マークアップ言語のスタイルを取っており、定められた記法に法って書いたファイルをTeXが提供する処理系(コンパイラみたいな)に渡す事で、
装置に依存しないDVI形式のファイルを生成する事ができます。
DVIファイルには紙面のどの位置にどの文字を配置するかといった情報が書き込まれており、
実際に紙に印刷したりディスプレイに表示させる際には、DVIファイルを解釈する別のソフトウェアが用いられます。

なお、このTeXにはマクロ機能もあり、複数の処理をまとめて行なう命令文を新しく作る事が可能です。
中にはTeXユーザーの有志の方が独自のマクロをパッケージ化し、配布しているケースもあります。
例えば

  • plain TeX: TeX作者自身が開発したもので,ごく基本的な文書作成機能を提供する
  • MusiXTEX: 楽譜の組版を作成できる
  • Publishing TEX(pTeX): 日本語用の機能(縦書き機能など)を追加

の様なものがあり、他にも様々なものがあります。
そしてLaTeXも、このマクロパッケージの一種に属しています。

LaTeXとは

TeXを使ってもっと簡単に論文やレポートを作成したい!」という要望によって作られたTeXのマクロパッケージです。
レスリー・ランポートによって作られました。

なお、LaTeXを日本語対応化したpLaTeXと言うものもあります。
そこから更に内部をUnicode化したupLaTeXもあります。

使い方

さて、このLaTeXですが…。
使用するためにはまず環境を整えてあげないといけません。

環境構築

と言うことで、まずはLaTeXを扱える環境を整えましょう。

なお、今回は先輩のqiita記事を大いに参考にしながら環境構築をしました。
下記にその記事とこの場を借りてお礼申し上げます。
(ぶっちゃけ、ここの章は下記の記事に少し知識を付け加えた程度です。インストール手順だけを見る場合は下記記事を参照することをお勧めします。)
qiita.com

大まかには下記の手順を踏みます。

  • MacTexのインストール
  • Texmakerのインストール
  • Texmakerの設定
MacTexのインストール

まず、TeX Liveという、TeXLaTeXを最低限使える様にする色々をまとめたもの(TeXディストリビューションというものだそうです)
…に、MacOS専用のGUI(どんなGUIがあるかはこちら参照)とGhostScriptが入ったMacTeXをインストール。
MacTeX(pkgファイル形式)DLページ
※3GBくらいあるので覚悟して臨みましょう。

DL後、MacTeX.pkgを開きGUIに沿ってインストール。
特に理由がなければデフォルト設定でやってしまいましょう。
なお、Homebrewでもインストール出来るそうです。
※Homebrewに関してはこちら

$ brew cask install mactex
$ sudo tlmgr update --self --all
$ sudo tlmgr paper a4
Texmakerのインストール

統合環境として使えるLaTeXエディタ、Texmakerをインストール。
Homebrewでインストール出来るみたいなので、下記コマンドで。

brew cask install texmaker

初期では日本語対応していないため、有志の方が作成して下さっている「日本語キットfor texmaker4.0.1」を用いて日本語対応化をする必要があります。

こちらの記事より「日本語キットfor texmaker4.0.1」をDL。
DLしてファイル解凍後、Finder>アプリケーションよりtexmaker.appを右クリック。
「パッケージの内容を表示」項目よりtexmaker.appが入っているフォルダへ。
そこからContents>Resourcesへ、先ほどDLして解凍したtexmaker_jp.qmを格納。
後はTexmakerを起動して、options>Interface Languageからjaを選択し、再起動すると日本語対応になります。

Texmakerの設定

TeXMaker上で実際に実行されるコマンドの中身を設定します。
Texmakerを開き、オプション>Texmakerの設定>コマンドへと飛びましょう。

主に設定するのは、先ほどDLしたMacTeX内にある各Texのコマンドへのパスです。

※下記の内容は、MacTexが「MacTex2017」であり、かつデフォルト設定でインストールされてる場合です。
(上記の状態では/Library/TeX/texbin/に全てのBinファイルが入ってるので下記の様なパスになっている)
他のVerやデフォルト設定でない場所にインストールされてる場合は、パスを該当のパスに変更しましょう。
パスが分からなくなった場合は、各設定部分の右端にフォルダアイコンがあり、クリックするとGUIでパスを変更する事も出来ます。どうしようもない時に利用しましょう。

  • LaTeX: "/Library/TeX/texbin/platex" -synctex=1 -interaction=nonstopmode %.tex
  • pdfLaTeX:"/Library/TeX/texbin/pdflatex" -synctex=1 -interaction=nonstopmode %.tex
  • dvipdfm:"/Library/TeX/texbin/dvipdfmx" %.dvi

ついでに「簡単コンパイル」の設定もしちゃいましょう。
Texmakerでは「簡単コンパイル」という機能があり、ボタン1つ(ショートカットキー1つ)でコンパイルしてプレビューを見ることが可能なのです。
オプション>Texmakerの設定>簡単コンパイルで、実行したいコマンドにチェックを入れます。
色々ありますが、参考記事では「LaTeX+dvipdfm+PDFファイルの表示」にチェックが入ってたので私もそれに。

ぶっちゃけプレビューするファイル形式を変更するだけなら、設定画面で弄らなくてもコマンドバーから設定できるのですが…。
より詳細に設定したいって人向けの欄なのでしょうな。

ちなみにTexmakerの設定からは、エディタのフォントサイズやフォントの種類、Tab幅なんかもいじれます。
カラーテーマもカラーコード入力でダイレクトに編集可能な様です。自由度が高い…!

完了

テストとして、こちらTeXサンプルファイルをDLし、開いてコンパイルしてみましょう。
問題が無ければ成功です。とりあえず私はこの手順で問題なかったです。

にしてもこのTexmaker、文書構造なんかもツリー表示してくれるんですね…すっごくありがたいです。

LaTeXの文書記法についてとかは…

ちょっと別記事にまとめたいと思います。
これまでこの記事に書くと、記事量が膨大になりそうなのでね…。

余談-オンラインのLaTeX執筆環境があるらしい

LaTeXについて調べていくと、オンライン上でLaTeXを扱える環境があるとのこと。

とりあえず自分が見かけたものが3つあったので、そのリンクだけ貼っておきます。

Javaで書く括弧検証プログラム その3

前前回の記事
前回の記事

括弧検証プログラムを作ろう その3

またまた学校の課題で括弧検証プログラムを作る事になりました。
今度はHTMLのコメント行(<!---->)、JavaC言語などのコメント行(/* */)などの、
「複数文字を一括りに括弧の様に扱うものでも対応出来る様に」すると言うもの。

また「後に対応する括弧が増えても、なるべく拡張性に富む様に。
理想は拡張のために1箇所のみを変更すれば良い様にする」とも告げられました。
折角だし、ユーザー入力で対応する括弧を拡張できたらなぁ…と思います。

そして、いつもの様にスクリプト言語は禁止みたいです。
まぁ前回前前回の様にJavaで行きましょうかね。

前回の課題時に、先輩のふつくしいソースコードを見れたので…。
それを参考にしつつ、良いソースコードを書いていきましょう!

複数のクラスを使って書こう!

先輩が書いたソースコードを見ると、
単一のクラスで全ての処理をするのではなく、複数のクラス同士を結びつけて処理を行わせていました。
しかもUML記法を用いたクラス設計図まであり…。
講義で学んだものはこう使えるのか!と凄く感動しました。

早速自分でも設計しちゃいましょう。
最終的には下記の様になりました。

BracketType
- typeN: String // 括弧の種類
- rawO: String // 対象の生の開き括弧データ
- rawC: String // 対象の生の閉じ括弧データ
Bracket
- type: BracketType // 括弧の種類
- rawD: String // 対象の生のデータ
- row: int // その括弧があった行数
- col: int // その括弧があった列数

それにしてもこうして書くとわかりやすいものなんですねぇ。
システム設計法的な講義でUML記法を学んでよかった。
それでは実装に向けてゴリゴリ書いて行きましょう。

今回のプログラムの全体の流れ

実装に向けてゴリゴリ書き始めている中、前回などの「ファイルから一文字ずつ参照して行く」方式では、
「複数文字から構成される括弧の対応を確認する」事自体がボトルネックになってしまいました。
2時間くらいウンウン悩んだ結果、これは一から考え直した方がいいなと思い…。
全体的な流れを今一度考えて見ることにしました。

具体的にはどこが問題点か?

今回問題点となった事は「ファイルから1文字ずつ参照すると次の文字を予測していかないといけない」と言う事です。
逆に言えば、それ以外は全く問題ないということ。

色々と考えた結果、最終的に「1文字ずつではなく1行で文字判定をする」事に落ち着きました。
この方式にすれば<!--が来た時に、「<の次に!が来たら…」と判定する必要はなくなりますしね。
ただ、今度は「複数文字列からどうやって目的の文字列を探し当てるか?」という問題に直面しました。

indexOfメソッドを使おう

これまたいろいろ探した結果Javaの文字列メソッドには、文字列から指定した文字列を取り出す「indexOf」というものがある事がわかりました。
つまり、1行ずつ読み込んだファイルの文字列から、「indexOf」メソッドで検証したい括弧を探せば…と思ったのですが。

ここでもまた問題点が2つ出てしまいました。
何とか解決は出来たので、その解決法も載せましたが…。
正直これがスマートな解決法かは分かりません…。
もし他の解決法等ありましたら、コメントしてくれると嬉しいです。

indexOfメソッドを使う問題点1: 行の先頭から検索ができない

従来は「1文字ずつ順番に文字列を検証していた」ので、
何も考えず閉じ括弧が来たらプッシュして、開き括弧が来たらポップして、と出来たのですが…。
今回の方法は「検証したい括弧を1行の中から探す」ため、
行の先頭から検索が出来ず、括弧を検知しながらプッシュポップをする事が不可能となってしまいました。

indexOfメソッドを使う問題点1-解決法: 括弧検知を全て終了→括弧対応検知を行う

解決法として「ファイル全ての括弧を抽出してからプッシュポップをしよう」と少し思い切った方法でやってみる事にしました。

全てのファイル内の括弧をBracket型のリストに1つ1つ追加していき、ComparatorとCollectorを使って行順と列順にリスト内をソート、
最後に前々回で考えた方法で括弧検証をする事に。

本当は括弧を検知しながらプッシュポップを…とする方がスマートだと思いますが、今回ばかりはしょうがないかもですね。

indexOfメソッドを使う問題点2: 検知した括弧を「検知済」と出来ない

当たり前ですが、1行の中に複数個同種の括弧が入っているパターンも考えられます。
このため、私は検索したい括弧の種類ごとにループを回せばいいと思ったのですが…。

indexOfはあくまで「検索するだけ」なので、元の文字列には何も変更を加えません。
これだとせっかく括弧を検知しても、ループさせてしまうとまた同じ括弧を検出してしまう事に…。

indexOfメソッドを使う問題点2-解決法: 自作関数の作成

こちらは関数を自作することで対応しました。
指定した文字を除外し、無関係な文字を入れた文字列を返すremoveStrという関数です。
この関数は今後も使いまわせそうですね。

参考までに、この関数のソースコードを貼っておきます。

最終的なプログラムの流れ

色々とまとめた結果、最終的にはこんな形に収まりました。

  • 専用クラス: Bracket、BracketTypeを定義
  • 検証する括弧の種類をBracketType型で定義
  • 括弧検証したい任意のファイルから文字列を1行ずつ読み込み
  • 各1行に対してその括弧が含まれているかを検索
    • 該当部分がある: その括弧をBracket型として定義し、リストに追加(検査した文字列はremoveStrで検査済み文字列に変換)
  • リストを行番号と列番号でソート
  • スタックを用いて括弧対応検証

後は書くだけです。ゴリゴリ書いていきましょう。

書きながら気づいた事

プログラムを書く時に気づいた、ちょっとした小ネタなどを記します。

クラスについて改めておさらい

折角クラスを使うのですから、Javaのクラスという概念について改めておさらいしてみる事に。

クラスとは:
プログラムを実行するための処理をまとめたオブジェクトで、クラスの処理の中にはメンバ変数や処理を実行するためのメソッドがあります。
メンバ変数とはクラス内で使用する変数のことで、メソッドとはメンバ変数などを使って行う処理をひと塊にまとめたものです。
参考記事

オブジェクト=部品、メソッド=手段/方法と考えれば分かりやすいでしょうか。
もう少しちゃんと言うなら「クラスとはプログラムの任意の処理を行える部品」…と言う感じでしょうか。
C言語とかにも外部ファイルを読み込んで〜とありますし、似た様なものでしょうか。

関数とメソッドの違い

これは別にJavaに限った話ではなく、他の言語にもありますけどね。
自分としては

  • 関数: 単独で実行できる処理の集まり
  • メソッド: オブジェクトに対する手段(このオブジェクトにこの動作をしてね、とか)/オブジェクトの後に.(ドット)をつけて記述する

くらいの認識だったのですが…。
本当にこの認識でOKなのか調べてみました。

結論からすると「大体あってる」という感じです。
参考までに、IT用語辞典に載ってるこれらの情報を載っけておきます。

関数とは: 引数と呼ばれるデータを受け取り、定められた通りの処理を実行して結果を返す一連の命令群。
多くのプログラミング言語では、関数がプログラムを構成する要素となっている。
多くの言語や処理系では、開発者の負担を軽減するため、よく使う機能が関数としてあらかじめ用意されている。
参考記事

メソッドとは: 方法、方式、手法、やり方、などの意味を持つ英単語。
ITの分野では、オブジェクト指向プログラミングにおいて各オブジェクトに属する処理や操作のことや、
通信プロトコルにおける要求の種類などのことをメソッドということが多い。
一般の外来語としては、一定の形式として確立した奏法、教授法、指導法、その他様々な技法のことを「○○メソッド」のように言う。
参考記事

オブジェクト指向プログラミングにおけるメソッドについて:
オブジェクト指向ではデータと手続きをオブジェクトとして一体化(カプセル化)して定義、利用する。
この、オブジェクトに内包された手続き(データに対する処理内容を記述したプログラム)のことをメソッドという。
言語によっては「メンバ関数」などということもあるが、ほぼ同じ機能を表す。
メソッドはそのオブジェクトに対する操作内容の詳細が実装されており、外部からメソッドを呼び出して起動することにより、その内容が実行される。
操作の詳細をオブジェクト内部に隠蔽することができ、プログラムの再利用性や生産性を高めやすくなると言われている。
参考記事

privateとpublicについて

以前から気になってた、"private"と"public"の違い。
この際なのでガッツリ調べてみました。

まずこれら二つは「アクセス修飾子」というもので、
クラス、インタフェース、メソッド、コンストラクタ、変数に対してこれを付けることが出来るとの事。

そしてアクセス修飾子というものは、

「指定した変数やクラスなどを、どの範囲から参照可能かのスコープを制御する」のに用いられるもの
参照記事

だそうです。
また、このアクセス修飾子には"private"と"public"の他にも"protected"と言うものもあるらしく、
それぞれの違いは下記のようになっております。

アクセス修飾子 概要 自ファイル 他ファイル
自クラス サブクラス 他クラス サブクラス 他クラス
public すべてのクラスからの参照を許す
private 自クラスからのアクセスしか許さない × × × ×
protected 他ファイル・他クラスからのアクセスをプロテクトする ×
なし × ×

参照記事

完成です!

いつものようにソースコードを貼り付けておきます。
※長ったらしいので折りたたんでおきました

余談

他の方のプログラムを見ると、正規表現やMapを用いてとってもスマートに完成させておられました。
もう括弧検査プログラムの改良課題はありませんが、個人的にものすごく気になる分野でもあるため、
ぜひJava正規表現について学んで見たいと思います。

学べば学ぶほど、学びたい事が出てくる!