HRR Co., Ltd.

技術的な記録を残していくことを目的としています。1次情報を大事にしています。

GAS (Google Apps Script) でファイル出力を行う

はじめに

小ネタです。
GAS (Google Apps Script) で文字コードを指定しつつ、ファイル出力することを考えます。

コード

/**
 * ファイル書き出し
 * @param {string} fileName ファイル名
 * @param {string} content ファイルの内容
 */
function createFile(fileName, content) {  
  var folder = DriveApp.getFolderById('##### フォルダID #####');
  var contentType = 'text/plain';
  var charset = 'utf-8';

  // Blob を作成する
  var blob = Utilities.newBlob('', contentType, fileName)
                      .setDataFromString(content, charset);

  // ファイルに保存
  folder.createFile(blob);
}

解説

使い方

フォルダID、ContentType、文字コードを指定するだけでOKです。
下記URLの******の部分がフォルダIDです。

https://drive.google.com/drive/u/0/folders/******

Blob ?

本当は createFile(name, content, mimeType) というズバリなものもあるのですが、こちらは文字コードの指定ができません。
Class DriveApp  |  Apps Script  |  Google Developers

遠回りなようですが、Blobオブジェクトを生成して、setDataFromString(string, charset) でファイルの内容を文字コード指定でセットしております。
Class Blob  |  Apps Script  |  Google Developers

最後に

JavaScriptの知識だけでは対応できないことも多いので、今後も小さいネタでも投下していこうと思います。
以上でした!

Laravelフレームワークの下準備をVirtualBox + CentOS7で行う

はじめに

Laravelを初めて使ってみることにしました。一番選ばれている印象が勝手にあります。

laravel.com

時間が許せばPhalconも使ってみる予定です。
ちなみに、私はSymfonyばかり使ってきた人間です。

バージョンはLTS(Long Term Support)の5.5を採用します。

laravel.com

5.5のドキュメントのGetting Startedに従って進めていきます。

https://laravel.com/docs/5.5/installation

手順

前提条件

必要なPHPの機能として、下記が要求されています。
Homesteadを使えば別なのですが、今回は使いません。

However, if you are not using Homestead, you will need to make sure your server meets the following requirements:

PHP >= 7.0.0
OpenSSL PHP Extension
PDO PHP Extension
Mbstring PHP Extension
Tokenizer PHP Extension
XML PHP Extension

現在のモジュールを見たい場合は、下記のどちらかのコマンドでみることができます。

$ php -m
$ php --modules

それと、Composerを使うことになるので、ない場合はインストールしましょう。 hrroct.hatenablog.com

Laravelのインストール

参照元に書いてあるとおりですが、下記を実行します。

$ composer global require "laravel/installer"

エラーが出たら随時対応しましょう。
私の場合はPHP extensionのzipがないよと言われました。

  Problem 1
    - laravel/installer v2.0.1 requires ext-zip * -> the requested PHP extension zip is missing from your system.
    - laravel/installer v2.0.0 requires ext-zip * -> the requested PHP extension zip is missing from your system.
    - Installation request for laravel/installer ^2.0 -> satisfiable by laravel/installer[v2.0.0, v2.0.1].

これは普通にyumでインストール可能です。

$ sudo yum install php-zip

私の場合は、PHP7をremiレポジトリを使って入れたので、指定が必要でしたが。

$ sudo yum install --enablerepo=remi,remi-php70 php-zip

改めて実行すると、成功のようでした。

$ composer global require "laravel/installer"
Changed current directory to /home/${USER}/.config/composer
Using version ^2.0 for laravel/installer
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Nothing to install or update
Generating autoload files

そして指定通り、PATHを通しておきます。

$ vim /home/${USER}/.bash_profile
export PATH=$PATH:$HOME/.config/composer/vendor/bin

ここでようやくインストールが完了です。

$ laravel --version
Laravel Installer 2.0.1

Laravelアプリケーションを作成する

パーミッションの関係もあって、rootで下記を実行してみたのですが。

# pwd
/var/www/html
# laravel new blog

Laravel 5.5系を想定していましたが、5.7系で作成されようとしているようで、エラーが頻発しました。
そこでもう一つの方法でインストールすることに。

composer create-project --prefer-dist laravel/laravel blog "5.5.*"

こちらならバージョンが指定できますし、問題なく成功しました。
ログは長いので省略で…。

php artisan serve

でサーバーを立てることが可能ですが、私の場合は仮想サーバーに立てたApache経由でアクセスさせることに。

そして下記にアクセス。
http://localhost:8080/blog/public/index.php
(私の場合は8080->80になるようポートフォワーディング設定をしております)

※ポートフォワーディングの設定についてはこちらをどうぞ。
hrroct.hatenablog.com

blog/public/.htaccessがきちんと動いていれば、index.phpはつけなくともアクセスできます。
http://localhost:8080/blog/public/

画面左上にこんなエラーが出ていたので、

The stream or file "/var/www/html/blog/storage/logs/laravel.log" could not be opened: failed to open stream: Permission denied
file_put_contents(/var/www/html/blog/storage/framework/sessions/tEHcnx2EJlGPRhLX4dH1zzrxxs3YXlWTVFY6NTHi): failed to open stream: Permission denied
file_put_contents(/var/www/html/blog/storage/framework/views/e96dfdf9e620607c1c331f2ec0b144a5937ac771.php): failed to open stream: Permission denied

それぞれこんなコマンドで対応。

# chmod 777 /var/www/html/blog/storage/logs/
# chmod 777 /var/www/html/blog/storage/framework/sessions/
# chmod 777 /var/www/html/blog/storage/framework/views/

SELinux関連の可能性もあります。
切り分けのために、下記コマンドで一時的に無効化してみるといいと思います。

setenforce 0

完了

f:id:hrroct:20190105142823p:plain

こんな超絶シンプル画面が表示されます。
背景が現在白なので全然境目がわからなさそう…。

最後に

この先はLaravelの自体の話になるので、また別の機会に回します。
以上でした!

CentOS 7にComposerをインストール

はじめに

CentOS 7にcomposerをインストールします。 getcomposer.org

"Dependency Manager for PHP" とある通り、PHPをインストールしていることが前提です。
また、私はVirtualBox上のCentOS 7に対して実行します。が、直インストールされている場合と大差ないと思われます。

手順

公式サイトにあるとおりに実行していきます。

getcomposer.org

まずはダウンロードから。

getcomposer.org

特にインストール場所やバージョンを指定しないなから、書いてある通りです。

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === '93b54496392c062774670ac18b134c3b3a95e5a5e5c8f1a9f115f203b75bf9a129d5daa8ba6a13e2cc8a1da0806388a8') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"

実行ファイルなのでbin配下に移動しておきます。
ユーザーによるインストールなので、/usr/local/bin/へ。

# mv composer.phar /usr/local/bin/composer
# composer --version
Composer version 1.8.0 2018-12-03 10:31:16

最後に

あっさり終わってしまったので、これにておしまいです。 以上でした!

Wikipediaのデータからプレーンテキストを出力

はじめに

Wikipediaのデータを出力する方法はいろいろあります。
その中のひとつ、Wikipedia Extractorを試してみました。

Wikipedia Extractor - Medialab

やり方

データはここから取得しました。
Index of /jawiki/latest/ jawiki-latest-pages-articles.xml.bz2

そして、データのあるディレクトリにPythonファイルをダウンロード。

$ curl -O http://medialab.di.unipi.it/Project/SemaWiki/Tools/WikiExtractor.py

バージョンを確認。

$ python WikiExtractor.py --version
WikiExtractor.py 2.55

オプションは公式ページにある通りです。

 -h, --help            show this help message and exit
 -o OUTPUT, --output OUTPUT
                       output directory
 -b n[KM], --bytes n[KM]
                       put specified bytes per output file (default is 1M)
 -B BASE, --base BASE  base URL for the Wikipedia pages
 -c, --compress        compress output files using bzip
 -l, --links           preserve links
 -ns ns1,ns2, --namespaces ns1,ns2
                       accepted namespaces
 -q, --quiet           suppress reporting progress info
 -s, --sections        preserve sections
 -a, --article         analyze a file containing a single article
 --templates TEMPLATES
                       use or create file containing templates
 -v, --version         print program version

引用元: http://medialab.di.unipi.it/wiki/Wikipedia_Extractor

私は下記の通りに実行しました。

$ python WikiExtractor.py --output ./text --bytes 500K jawiki-latest-pages-articles.xml

こんなディレクトリ構成になります。

$ ls -alR text/
text/:
合計 4
drwxrwxr-x. 3 user group   16 1230 20:27 .
drwxr-xr-x. 3 user group  111 1230 21:11 ..
drwxrwxr-x. 2 user group 4096 1230 21:11 AA

text/AA:
合計 19764
drwxrwxr-x. 2 user group   4096 1230 21:11 .
drwxrwxr-x. 3 user group     16 1230 20:27 ..
-rw-rw-r--. 1 user group 500699 1230 21:08 wiki_00
-rw-rw-r--. 1 user group 489585 1230 21:08 wiki_01
-rw-rw-r--. 1 user group 510798 1230 21:08 wiki_02

内容はこんな感じ。docタグに囲まれて1記事が出力されています。
url属性にあるURLが元記事のURLなのですが、h2タグに当たる部分が省かれていることがわかります。

<doc id="56" url="https://ja.wikipedia.org/wiki?curid=56" title="地理">
地理

地理(ちり、英: Geography)
「地理」という表現は古くからあり、有名なところでは漢書の『地理志』がある。
地理学とは、地球の表面と住民の状態、その相互関係を研究する学問である。
「地理」は、日本の学校で設置されている、「人間の生活に影響を与える地域的、社会的な構造」を学ぶための科目である。自然環境や産業環境などを含む環境を学習対象としている。小学校および中学校においては、歴史や公民と並び、社会科の一分野である。高等学校においては、最近は「地理歴史科」という教科の中の一科目となっており、「地理A」「地理B」に細分されている。

</doc>

気になる点

私はヘッダタグ部分もほしかったので、ちょっと残念。
そして、私の環境では、なぜか処理が途中で中断してしまいます。
食わせるファイルのサイズが大きかったからでしょうか。

$ python WikiExtractor.py --output ./text --bytes 500K jawiki-latest-pages-articles.xml
INFO: Loaded 0 templates in 0.0s
INFO: Starting page extraction from jawiki-latest-pages-articles.xml.
INFO: Using 1 extract processes.
zsh: killed     python WikiExtractor.py --output ./text --bytes 500K

さいごに

なかなか自分がほしい形式で出力してくれるものが見つかりませんね。
自分で作るのが一番なのかも…と思いました。

以上でした!

WikipediaのデータをMySQLに突っ込んだ話

はじめに

Wikipediaのデータを、VitualBoxで立ち上げたCentOS7のMySQLに入れてみました。
クローラーでのコンテンツの取得は禁じられているので、要注意です。

Wikipedia:データベースダウンロード - Wikipedia

クローラを用いてコンテンツを収集しないでください。

その代わり、Wikipediaのデータは圧縮されたXMLファイルで提供されています。
ここでは、そのデータを取り込む方法を書いていきます。

ただし、DBに格納されるデータは、MediaWiki形式で書かれた文字列なので、そのまま他に流用は厳しいです。
(ということがわかりました)

作業の流れ

上記の通り、このXMLのファイルを取り込むのですが、そのためのPHPファイルも提供されています。

Wikipedia:データベースダウンロード - Wikipedia

これらのXMLファイルをMySQLデータベースにインポートするには、MediaWiki配布物に含まれるimportDump.phpスクリプトを使用します。

$ bunzip2 -c pages-articles.xml.bz2 | php maintenance/importDump.php

コマンドを叩くだけなら簡単、と思いますが…これを動かすには、最終的には「LocalSettings.php」というファイルが必要です。
このファイルには、主にDBへの接続情報が書かれています。
接続情報なしにデータベースにはデータを入れることはできないで、当たり前といえばそれまでですが。

そしてその「LocalSettings.php」は、MediaWikiのインストールの過程で作成されるものです。
つまり…

  1. Wikipediaのシステムの元であるMediaWikiを仮想環境にインストールし、
  2. その上でWikipediaのデータをimportさせる。

必要があるということです。ちょっと遠回り。

Wikipediaのデータ

日本語のデータについては、こちらに入っています。
Index of /jawiki/
XML形式のファイルで、UTF-8です。
欲しいデータはWkipediaのごく一部のページでも、どこにあるかはわかりづらくなっています。

記事が入っているデータは、
Index of /jawiki/latest/

jawiki-latest-pages-articles.xml.bz2  

これになります。圧縮された状態で2.8GBくらいありますね。 分割されたデータもあり、それは

jawiki-latest-pages-articles1.xml.bz2  
jawiki-latest-pages-articles2.xml.bz2  
jawiki-latest-pages-articles3.xml.bz2  
...

のように連番になっています。

データを取り込むには?

Wikipedia:データベースダウンロード - Wikipedia

上にも書きましたが、下記コマンドを実行することを目指します。

$ bunzip2 -c pages-articles.xml.bz2 | php maintenance/importDump.php

データを取り込むまでに必要な準備

bzip2のインストール

人によっては入っていないと思いますので、まずはここから…。 CentOSならyumですぐにインストールできます。

$ sudo yum search bzip2
$ sudo yum install bzip2.x86_64
$ bzip2 -V
bzip2, a block-sorting file compressor.  Version 1.0.6, 6-Sept-2010.

   Copyright (C) 1996-2010 by Julian Seward.

   This program is free software; you can redistribute it and/or modify
   it under the terms set out in the LICENSE file, which is included
   in the bzip2-1.0.6 source distribution.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   LICENSE file for more details.

bzip2: I won't write compressed data to a terminal.
bzip2: For help, type: `bzip2 --help'.

解凍時は、こんなふうに使います。 特別難しいことはありません。

$ bunzip2 jawiki-latest-pages-articles.xml.bz2
記事のダウンロード
$ curl -O https://dumps.wikimedia.org/jawiki/latest/jawiki-latest-pages-articles.xml.bz2
importData.php のダウンロード

といいますか、MediaWikiソースコードのダウンロードです。
importData.phpは、MediaWikiソースコード内にある maintenance/importData.php です。
メンテナンスツールの一部なのでしょう。

今回はgit cloneで入手します。
MediaWiki · mediawiki

$ git clone https://phabricator.wikimedia.org/source/mediawiki.git
この時点で試しに実行

私が実行したときは、書かれたコマンドの準備ができたということで、(LocalSettings.phpはないものの)実行してみたのでした。
そうしましたら、

$ php mediawiki/maintenance/importDump.php < jawiki-latest-pages-articles.xml
Error: You are missing some external dependencies.
MediaWiki now also has some external dependencies that need to be installed
via composer or from a separate git repo. Please see
https://www.mediawiki.org/wiki/Download_from_Git#Fetch_external_libraries
for help on installing the required components.

私の場合「LocalSettings.php」がないという以外のエラーが出ました。
「いくつかの外部依存が足りていない。MediaWikiはいくつかの外部依存が必要で、それはcomposerで取ってくるか、gitから取ってきてくれ。詳しくはこのURLを見てね(超意訳)」
とのことなので、URL先を見てみる。

やり方はcomposerを使うか、gitで落としてきてもいいらしい。 composerがなかったので、私はgitで取得することにしました。

vendor/のダウンロード

MediaWikivendor/ ディレクトリをgit cloneしてくるだけなので楽です。

$ cd mediawiki/
$ git clone https://gerrit.wikimedia.org/r/p/mediawiki/vendor.git

そして改めて実行するわけですが、

$ php mediawiki/maintenance/importDump.php < jawiki-latest-pages-articles.xml
Error: Missing one or more required components of PHP.
You are missing a required extension to PHP that MediaWiki needs.
Please install:
 * xml <https://secure.php.net/xml>

Errorが出ましたが、私の場合はPHPのモジュールとしてのxmlがインストールされてませんでした。
人によって足りないものが異なるでしょうから、一度実行してみるのがよいと思います。

phpの足りない拡張機能をインストール

ここは他のサイトに説明を譲ります。

そして再実行

$ php mediawiki/maintenance/importDump.php < jawiki-latest-pages-articles.xml
A copy of your installation's LocalSettings.php
must exist and be readable in the source directory.
Use --conf to specify it.

ここで「LocalSettings.php」が必要だと言われます。
冒頭に書いたとおり、ここで諦めてMediaWikiをインストールして、その過程で生成しようと思います。

MediaWikiをインストール

ということで、まずはMediaWikiをブラウザから見れるように、ソースコードをドキュメントルートに持っていきます。
私の場合、ホームディレクトリに置いていたので移動します。

# cp -rp mediawiki/ /var/www/html/

下記にアクセスして、
http://localhost:8080/mediawiki/index.php

下記の画面が表示されれば、いったん成功になります。 f:id:hrroct:20181008234338p:plain

こんなエラーがCentOSで出る場合はSELinux関連の可能性があります。

[Sun Dec 16 23:21:25.810925 2018] [:error] [pid 12818] [client 10.0.2.2:60328] PHP Warning:  Unknown: failed to open stream: Permission denied in Unknown on line 0
[Sun Dec 16 23:21:25.810984 2018] [:error] [pid 12818] [client 10.0.2.2:60328] PHP Fatal error:  Unknown: Failed opening required '/var/www/html/mediawiki/index.php' (include_path='.:/usr/share/pear:/usr/share/php') in Unknown on line 0

MediaWikiの設定を行う

長い。道のりが長くて記事を分割したくなりますが、まだタイトルに行き着いていないのでがんばります。

f:id:hrroct:20181008234338p:plain

基本的にはポチポチクリックして進めていきます。

f:id:hrroct:20181230115232p:plain

ここは日本語そのままでよいでしょう。

f:id:hrroct:20181230115253p:plain

ここでDBの接続情報、ユーザーの情報を入れます。

f:id:hrroct:20181230115316p:plain

MySQLなので、ストレージエンジンの選択を行います。

f:id:hrroct:20181230115356p:plain

データ取得が目的なので、私の場合は何でもよかったです。

f:id:hrroct:20181230115426p:plain

飽きたので、とにかくインストールしてもらいます。

f:id:hrroct:20181230115546p:plain

これでインストールが完了します。

f:id:hrroct:20181230115624p:plain

ここでようやく、LocalSettings.phpをゲットできます。

ようやく実行

$ php mediawiki/maintenance/importDump.php < jawiki-latest-pages-articles.xml

したのですが…
私の環境では3日経ってもimportが終わりませんでした…
(メモリ8G、Core i5(第8世代)のノートPC)
Wikipediaのデータ量、恐るべし。

私のときは、下記エラーがたくさんできるので、設定しておいたほうが無難かも、です。

PHP Notice:  Undefined index: SERVER_NAME in /var/www/html/mediawiki/includes/GlobalFunctions.php on line 1374

もうひとつのやり方?

xml2sqlを使う手段もあるそうですが、どうやら非推奨のようです。

Data dumps/xml2sql - Meta

最後に

次はデータベースの中身の話ですが…
長くなるので、続きは別記事で。

以上でした!