MeCab 0.996 on MacOS 10.12.6 with xcode 8.3.3

ちょいと用事があって久しぶりにC++でコーディング。MeCabライブラリーを使う用事があったので、Macで動かして確認。

MeCab 0.996

まず、和布蕪はこちらからダウンロード。

http://taku910.github.io/mecab/

バイナリーはWindows版しかないので、ソースコードを落としてきてコンパイルする。当然、xcodeとコマンドラインツールが必要。たとえば、こんな手順。

macOS Sierra に Xcode Command Line Tools をインストールする

https://stangler.blogspot.jp/2017/02/macos-sierra-xcode-command-line-tools_14.html

こちらの手順がインストール手順としては参考になる。

MeCabをMacにインストールする手順

http://qiita.com/nkjm/items/913584c00af199794257

IPAの辞書を使った。

xcodeでプログラミング

xcodeを立ち上げ、メニューから[File]→[New]→[Project] と選び、「Command Line Tool」を選択、プロジェクト名を適当につけつけ Languageの「C++」を選んでNextを押して場所を指定すればよい。Main.cppにmain関数のあるプロジェクトができあがる。

MeCabに対するプログラミングは、以下の手順がわかりやすい。

mecab使ってみる

http://lepetit-prince.net/ios/?p=4140

MeCab本体のサイトにも、サンプルが載ってる。

http://taku910.github.io/mecab/libmecab.html

 

広告

プログラミング入門-5 変数を使いましょう

リテラル

前回、alert( ) 関数を呼び出すことで警告ボックスを表示しました。

alert("Hello, world!");

関数の引数として渡している “Hello, world!”という文字列は固定の値で、「リテラル(literal)テキスト(text)」と言います。この文字列はプログラムのソースコードに書き込んであるので、実行するときに変更することができません。

リテラル文字列は’(シングルクオーテーション:quotation)または”(ダブルクオーテーション:double quotation)で囲んで記述します。かならず挟まなければならず、同じものの組み合わせで書きます。囲むため、’や”を文字列自体に書き込むことができません。このため、「エスケープ(escape)シーケンス」という方法を使って記述することができます。それは、’や”の前に\(バックスラッシュ: back slash)をつける方法です。たとえば「リテラルは’や”で囲みます」をリテラルで書くときは、

alert("リテラルは\'や\"で囲みます");

のように書きます。(注意:Windows日本語版では¥マークを\として書きます)

改行

文字列に改行を入れたい場合は「\n」を「改行文字(newline character)」として挿入します。また、文字列にエスケープのためのバックスラッシュ\を入れたい場合は、二つ「\\」と書きます。これを両方使った文字列を表示してみましょう。

alert("改行するには、\\nを\n挿入します。");

これで、以下のように表示されます。

改行するには\nを
挿入します。

エスケープシーケンスには他にもいろいろな種類があります。ググって確認してください。

実行中に変化する「変数」

プログラム実行中に変化する入れ物を作り、そこに値を入れることで処理中に様々なものを処理できます。この入れ物を「変数(variable)」と言います。数学の式でXやYといった文字を使って計算をすることがありますが、あれも変数です。コンピューターの世界では数学用語が多用されています。

前回書いたコードを以下のように書き換えましょう。

var output_text = "Hello, world!";
alert(output_text);

前回とまったく同じように動作したと思います。

var output_text の行を「変数の宣言(declaration)」といいます。output_textは「変数名(variable name)」です。= で右に値(リテラルか変数か式)を書くと、その値が変数にセットされます。これを「代入(substitution)」するといいます。

変数なので変更が可能です。

var output_text = "Hello, world!";
alert(output_text);
output_text = "リテラルは\'や\"で囲みます";
alert(output_text);

3行目ではvarを記述していません。これは1行目で宣言されたoutput_textを使っているからです。このように同じ変数を使い回すことになります。

数値の取り扱い

“”で囲んだものは文字列ですが、「数値(value)」を取り扱うこともできます。数値も文字列と同じようにソースコードに直接書いたリテラルと変数の両方で取り扱えます。数値は文字列と違って計算ができます。数値の計算はリテラルと変数の組み合わせで自由に行えます。以下の例は、変数aとbを宣言し、1と2を代入したあと、aとbを足した値をaに代入している例です。このように文章で書くより、プログラミング言語のほうがわかりやすいと思います。

var a = 1;
var b = 2;
a = a + b;
alert(a);

このプログラムを実行すると、警告ボックスに「3」と表示されます。

文字列の結合

文字列を表示したりするにあたり、複数のリテラルや変数の値を組み合わせてメッセージを組み立てたいことがあります。そのような場合、文字列を「+」文字で結合することができます。
たとえば、先ほどのプログラムを「結果は 3」のように表示するには、alert関数を以下のように書き換えます。

alert("結果は "+a);

ここで気をつけたいのは、計算式を文字列の結合に含めた場合の処理の優先です。たとえば、以下のように書き換えてみます。

alert("結果は "+a+b);

この場合、メッセージは「結果は 32」と表示されます。aの値が3、bの値が2だからです。
では、「a+b」の結果を表示したい場合はどうしたらいいでしょうか?計算式の優先順位は()で制御できます。数学の式と同じですね。

alert("結果は "+(a+b));

これで、「結果は 5」と表示されます。

プログラミング入門-4 JavaScriptを書いてみよう

読者が「説明より実践派」とのご意見だったので、とりあえず、ひとつか二つ書いてみてもらうことにしました。

お使いのパソコンがMS Windowsなので、それに合わせて解説していきます。

JavaScriptとは

JavaScriptとは、インターネットを観るためのプログラム「Webブラウザー」の画面を表示したときに動作するプログラムです。プログラムはWebブラウザーがWebコンテンツと一緒に読み込み、パソコンの上でWebブラウザーがプログラムを実行します。Webブラウザーという実行プログラムが読み込んだJavaScriptプログラムを実行するので、一般的にはJavaScriptはインタープリター言語です。(JITコンパイラーと呼ばれる機構でコンパイルされることがありますが、ここでは解説しません)

JavaScriptにはサーバーやクラウドで実行するタイプのものもありますが、これもここでは解説しません。

なぜここでJavaScriptを選択するかというと、Windowsを持っていれば書いてすぐ実行できるからです。なにも追加でインストールする必要がありません。

プログラミングの準備

なにもいらないとはいえ、プログラミングするのにWindowsはディフォルト設定では使いにくいので少し設定します。

  1. 「エクスプローラー」を開いてください。
  2. メニューから「表示」タブを選択してください。
  3. 「ファイル名拡張子」にチェックを入れてください。

プログラムファイルを作りましょう

エクスプローラーで、自分の好きな場所にファイルを作ります。たとえば「デスクトップ」でもかまいません。

  1. エクスプローラーでそのフォルダーを開いてください。
  2. 背景を右クリックし、「新規作成」→「テキストドキュメント」を選んでください。
  3. ファイル名が「新しいテキストファイル.txt」などとなり名前が編集状態になりますので、「programming1.html」などと変更します。

「txt」という部分(拡張子といいます)も変更するのを忘れないように!

中身を編集しましょう

ファイルを右クリックし、「プログラムから開く」→「メモ帳」でオープンします。初めてのときは「メモ帳」が表示されないかもしれません。その際は「プログラムから開く」→「別のプログラムを選択」を選び、一覧を一番下までスクロールして「その他のアプリ」を選び、「メモ帳」を選びます。2回目からは最初から選択できるようになっています。

メモ帳が開いたら、以下のような内容を書き込んでください。

<html>
<body>
<h1>Hello</h1>
world!
</body>
</html>

Ctl+Sを押して保存します。

エクスプローラーに戻り、このファイル(ここではprogramming1.html)をダブルクリックします。すると(通常であれば)、Webブラウザーが立ち上がり「Hello World!」と表示されます。

Hello

world!

これで、このファイルがWebブラウザーで表示されたことが確認できます。この部分までは「ページが表示された」という状態で、まだプログラムは書かれていません。

プログラムを書き込みましょう

メモ帳に戻り、以下のように書き換えます。

<html>
<script type="text/javascript">
alert("Hello, world!");
</script>
<body>
<h1>Hello</h1>
world!
</body>
</html>

Webブラウザーに戻り、Ctl+Rを押してリロードします。

すると小さなウィンドウ(警告ウィンドウといいます)が開き、「Hello, world! [OK]」が表示されます。これで、プログラムが動いたことになります。

ちょっと解説

後半で追加したのは以下の部分です。

<script type="text/javascript">
alert("Hello, world!");
</script>

このファイルはHTML(Hyper Text Markup language)ファイルと呼ばれ、インターネットの画面を作っているファイルの形式です。

<xxxx>

形式で書かれているものは「開始タグ」といい、

</xxxx>

 

形式で書かれている部分を終了タグといいます。これで、テキストファイルを構造的に書いていくのがhtmlです。

scriptの開始・終了タグで囲まれた部分がJavaScriptが書かれている部分です。今回のコードは「alert(“Hello, world!”);」という部分です。scriptで書かれているJavaScriptは、通常、htmlファイルを読み込んだときに一回だけ上から順番に実行されます。

alert( … ) のように、カッコを従えた記述を「関数呼び出し(function call)」と呼びます。alert 関数は、警告ウィンドウを表示するための関数です。関数とは、一般的には別のところに書かれているプログラムの一節です。関数は、その「別の場所に書かれているプログラムを呼び出す」という方法です。呼び出しなので、戻ってきます。

カッコの中には「Hello, world!」という文字列が書かれていますが、これを「関数の引数(function argument)」といいます。

つまり、このプログラムは「”Hello, world!”」という引数で alert関数を呼び出し、警告ウィンドウを表示した、ということになります。

プログラミング入門-3 コンパイルとインタプリタ

前回説明したように、プログラムとはコンピューターのデータの一種で0と1の並びです。16進数で表すこともできますが、現代のプログラミング言語は数学の表記と英語の文法に近い形で記述することができます。

プログラムは、一旦人間によって書かれたあと、前回説明したようにアセンブル処理されて0と1の並びに変換されて処理されるのが基本です。HLL(高級言語)で書かれたプログラムがアセンブルと同じ処理が行われて、コンピューターの処理命令に変換されてバイナリープログラムに変換される処理を「コンパイル」といい、それを行うためのプログラムを「コンパイラー」といいます。

もうひとつ別の方法があります。コンピューター(ハードウェア)が直接処理できる命令の羅列に変換せず、プログラム記述データ(HLLで書かれている)を読み込んで、そこに書かれている通りの処理をするプログラムが処理を行うことです。これは「通訳」という意味と同じ「インタープリト」といい、それを行うプログラムを「インタープリター」といいます。また、インタープリターに読み込ませることができるプログラミング言語を「インタープリター言語」といいます。

プログラミング入門-2 プログラミング言語

初期の計算機は、処理内容を決めるときに配線を変更することで行なっていました。これは「プログラマブルコンピューター」ではないので、それはここでは除外します。プログラマブルコンピューターとは、プログラムというデータを読み込むことで機能を変更することができるものを指し、フォン・ノイマンがメンバーであったチームが最初に発表したことから「ノイマン式コンピューター」と呼ばれています。今日のコンピューターは、みなこの仲間です。

プログラムはデータです。

2進数と16進数

コンピューターのデータは0と1の組み合わせだけで作られているものです。これを2進数(バイナリー:binary)と呼びます。

101001010010100100100101010000010101111010100101010110101

これは人間が読みにくすぎるので、0-9とA-Fで表す、16進数(ヘキサデシマル:Hexa decimal)というもので表現することが多いです。これは2進数を4桁あつめたものが16進数に変換しやすいからです。

0000=0, 0001=1, 0010=2, 0011=3,
0100=4, 0101=5, 0110=6, 0111=7,
1000=8, 1001=9, 1010=a, 1011=b,
1100=c, 1101=d, 1110=e, 1111=f

024f5b682ca895e8b..

プログラム

プログラムできる計算装置(Programmable Computer)が発明された直後、プログラムは16進数で作るようになっていました。たとえば、メモリーの0番地にある数字を計算用のメモリー(レジスターといいます)の0番にコピーし、4番地にある数字をそれに足し、8番地に保存するとします。メモリーからレジスターにコピーする命令をL(Load)、足し算するのをA(Add)、レジスターの内容をメモリーにコピーする命令をS(Store)とします。すると、以下のようなプログラムを書くことになります。(IBM System/360のコード)

プログラム
5800000 5A000004 5B000008

記号
L 0,0(0,0)
A 0,4(0,0)
S 0,8(0,0)

プログラムの正体は0と1の配列(2進数)で、16進数で表記します。これだけだとわかりにくいので、記号で表します。この記号をニーモニックと呼び、アセンブラ言語ともいいます。

アセンブラ言語

プログラマブルコンピューターが生まれた初期のころは、プログラムをニーモニックで書き、16進数を手で作っていました。その後、ニーモニックを入力にして16進数プログラムを自動生成するソフトウェアが作られました。このように、ニーモニックをバイナリーに変換することを「アセンブル:assemble(する)」といい、それを行うためのプログラムを「アセンブラー(assembler)」といいます。また、ニーモニックで書いたプログラムを「アセンブリ言語」とか「アセンブラー言語:assembler language」と言います。

高級言語(High Level Language / HLL)

コンピューターの配線やニーモニックとアセンブラーによるプログラミングは、特殊技能であり、とても苦痛の多いものでした。そこで、米国海軍に所属していた数学者グレース・ホッパー女史が、「こんなのやってられっかい、私は英語の文法でプログラムを書きたい!」といって、ニーモニックではなく、数学表現と英文法でプログラムを書く方法を開発しました。Flow-Maticというプログラミング言語で、世界初のものとなります。このように英文法でプログラムを書く言語を「高級言語」と言います。(逆にアセンブラ言語は低級言語と呼ばれるようになりました)現代のプログラミング言語は、すべて高級言語です。

プログラミング入門-1 プログラムてなに?

コンピューターは計算装置です。電卓に毛が生えたような機械です。なのでとても機能が少ないです。すごく極端にいうと、次のような機能しかありません。

  • データの保持
    メモリーという装置にデータを一時的に保存し、処理に利用します。
  • 外部機器への書き込み・読み出し
    より大きな容量の装置(HDD、SSD、CD、DVD、Blue-ray、テープ装置・・・)へのデータの保存や、ネットワークを通して他の機器とデータの送受信
  • 命令の処理
    データの一種です。計算装置に「なにをすればよいかを順番に書いたデータ」が含まれています。これを「プログラム」と呼びます。

命令というのはデータの一種です。

コンピューターの命令には、以下のようなものがあります。これらを、プログラムのデータとして順番に処理できるようにしたものが「プログラム」です。

  • 四則演算(基本は二進数演算)
  • データのコピー(移動含む)
  • プログラムの実行順序の制御(条件分岐)

 

プログラミング入門

とある方にプログラミングを教えることになり、簡単な資料を作る必要がでてきました。そこで、せっかくなのでブログに書いて、再利用できるようにしてみようかと思います。

今回のお相手はロジカルな方なので、「やってればそのうち覚える」方式ではなくて、論理的に解説する方法でいきたいと思います。

こちらのブログシリーズは Programming 101というタグをつけていきますので、追跡しやすいと思います。