Home | First | Prev | Next | Last |
$ sudo apt install dict dictd dictfmt dict-freedict-eng-jpn dict-freedict-jpn-eng辞書データベースは /usr/share/dictd にインストールされていました。ターミナルで
$ dict -Iとすると、インストールされているデータベースが次のように表示されました。
Database Headwords Index Data Uncompressed fd-eng-jpn 28680 496 kB 1200 kB 2850 kB fd-jpn-eng 375820 8781 kB 8695 kB 36 MB/etc/dictd/dictd.conf などを設定することなく、すぐに dict を使って辞書を見ることができました。
dict://localhostと入れるだけです。英和辞書も、和英辞書も使うことができました。
■agreeable {形-1} : 喜んで同意{どうい}[賛成{さんせい}]する◆【用法】前置詞 to を使って賛同の対象を表す。■・He's agreeable to the plan. 彼はその計画に賛同的だ。上記のように、一項目が一行でしるされています。見出し語は "■" と " : " で囲まれています。dictfmt に「見出し語が ":" で囲まれている Jargon 形式のファイルを dict データベースに変換するオプションがあるので、英辞郎データ→UTF-8 テキスト→Jorgon テキスト→dict データベースとインデックスファイル→データベースの圧縮 の順で作業を進めることにしました。
$ nkf -w eijiro81.txt > eijiro.utf8 $ cat eijiro.utf8 | perl -p -e 's/^■/:/;s/ : /:\n/;s/◆/\n/g;s/■・/\n/g' > eijiro.jargon $ dictfmt --utf8 -s "英辞郎" -j eijiro < eijiro.jargon $ dictzip eijiro.dictこのようにして出来た eijiro.dict.dz と eijiro.index を /usr/share/dictd にコピーしました。Goldendict で辞書の「再スキャン」をすると、インデックスが作り直されました。
$ libreoffice --headless --convert-to txt SAMPLE.odtとすれば良く、
$ libreoffice --headless --convert-to txt *.odtとすれば、一括変換もできます。
$ unoconv --stdout -f txt *.odt >> temp.txtpdf への変換も unoconv なら
$ unoconv -f pdf SAMPLE.odtでできます。また、画像から pdf への変換もできます。
$ unoconv -f pdf image.pngただし、複数の画像をひとつの pdf 文書に出力することと、複数ページのpdf をページごとの画像に出力するのはできませんでした。これをするには、pdftk か、ilovepdf.com のオンライン変換サービスを使う必要があります。
$ unoconv -f pdf SAMPLE.odp文字情報を取り出したいときは、直接テキストファイルには変換できないので、html ファイルに変換してからにしました。
$ unoconv -f html SAMPLE.odp $ unoconv -f txt SAMPLE.html
$ sudo apt install graphicsmagick-imagemagick-compat
$ convert image.png image.jpgで画像タイプを変換できましたが、GraphicsMagick の場合は
$ gm convert image.png image.jpgとしなければなりません。convert は、コマンド gm の機能オプションとみなされるわけです。このほうが論理的でいいと思いました。
$ man gmで見ることができます。私がよく使うのは
gm convert 画像のサイズやタイプなどを変換する gm display 画像を表示する gm identify 画像の情報を得る gm mogrify 画像を変形するぐらいですが、convert だけでも、たくさんのオプションがあり、試したことのないものがたくさんあります。gm <function> を使うメリットは、一括変換ができる点にあるので、いままで gimp でやっていた作業をどの程度まで、gm <function> でできるか試してみたいと思っています。
$ python -m http.server --cgi 8000それからブラウザで
http://localhost:8000/index.htmlとすると、ローカルホスト上で cgi の動作テストができました。手軽で便利でした。
$ sudo apt install sqlite3で、sqlite3 を導入しました。これは MySQL と違って、インストールした直後から、設定なしで、すぐ使えました。
$ sqlite3 ejdict.sqlite3それから、データベースの構造を調べました。
sqlite> select * from sqlite_master;「テーブル名」が items、各「レコード」には item_id, word, mean, level の「フィールド」があることが分かりました。
sqlite> select * from items limit 5単語の登録数は次のようにして調べました。
sqlite> select count(word) from items;48,290 ありました。
sqlite> select * from items where word="apple";としました。"apple" から始まる単語をすべて調べるのには
sqlite> select * from items where word like "apple%";としました。
sqlite> .exitでできました。sqlite3 は python からコントロールできるようなので、「辞書検索」や「データベース登録」のプログラムを作れそうです。
import sqlite3と記入しました。使用するデータベースを ejdict.sqlite3 とし、これへの接続は次のようにしました。
conn = sqlite3.connect("ejdict.sqlite3") c = conn.cursor()テーブル名 items の各レコード(行)には、item_id, word, mean, level というフィールド(列)があり、見出し語は word に、定義は mean に入っています。word に "apple" を含む レコード(行)を見つけるために、次のように命令文を実行し、結果を rows に代入しました。
input_word = "apple" rows = c.execute("select * from items where word='{}'", "apple")
for row in rows: print("{} {}\n" .format(row[1],row[2]))
import sqlite3 def find_definitions(input_word): rows = c.execute("select * from items where word='{}'" .format(input_word)) for row in rows: print("{} {}\n" .format(row[1],row[2])) return conn = sqlite3.connect("ejdict.sqlite3") c = conn.cursor() while True: input_word = input("English Word >> ") if input_word == '': break; find_definitions(input_word) conn.close()
rows = c.execute("select * from items where word='{}'" .format(input_word))を次のように変えました。
rows = c.execute("select * from items where word like '{}' limit 6" .format(input_word))「word = ....」の代わりに「word like ....」にしただけです。こうすれば、「apple%」と入力すると、「apple」から始まる見出し語が apple, apple butter, apple green, apple-pie-order, apple-polish, applecart などのように表示されます。
class Color: BLACK = '\033[30m' #(文字)黒 RED = '\033[31m' #(文字)赤 GREEN = '\033[32m' #(文字)緑 YELLOW = '\033[33m' #(文字)黄 BLUE = '\033[34m' #(文字)青 MAGENTA = '\033[35m' #(文字)マゼンタ CYAN = '\033[36m' #(文字)シアン WHITE = '\033[37m' #(文字)白 COLOR_DEFAULT = '\033[39m' #文字色をデフォルトに戻す BOLD = '\033[1m' #太字 UNDERLINE = '\033[4m' #下線 INVISIBLE = '\033[08m' #不可視 REVERCE = '\033[07m' #文字色と背景色を反転 BG_BLACK = '\033[40m' #(背景)黒 BG_RED = '\033[41m' #(背景)赤 BG_GREEN = '\033[42m' #(背景)緑 BG_YELLOW = '\033[43m' #(背景)黄 BG_BLUE = '\033[44m' #(背景)青 BG_MAGENTA = '\033[45m' #(背景)マゼンタ BG_CYAN = '\033[46m' #(背景)シアン BG_WHITE = '\033[47m' #(背景)白 BG_DEFAULT = '\033[49m' #背景色をデフォルトに戻す RESET = '\033[0m' #全てリセット
input_word = input(f"{Color.BOLD}{Color.RED}English Word >> {Color.RESET}")「見出し語」と「定義」の部分は次のようにしました。
for row in rows: index_word = row[1] definition = row[2] print(f'{Color.BOLD}', end='') print(index_word, end='') print(f'{Color.RESET}', end= '') print(' {}\n' .format(definition))
$ sudo apt install python3-tk
import tkinter as tk from tkinter import scrolledtext import sqlite3この部分は、必要なモジュールの読み込みです。"from tkinter import scrolledtext" は結果を表示するテキストボックスにスクロール・バーをつけるためのモジュールです。
# ボタンを押したときの処理 def search_dic(): # テキストボックスから英単語を得る word = entryWord.get() # データベースに接続 conn = sqlite3.connect("ejdict.sql") # カーソール・オブジェクトの生成 cur = conn.cursor() # SQLのコマンド sql = "SELECT * FROM items WHERE word LIKE ?" # 処理結果を格納(row[0] はインデックス) rows = cur.execute(sql, (word,)) result = "" for row in rows: result += "【{0}】{1}\n".format(row[1],row[2]) conn.close() # 結果を表示 textResult.delete('1.0', 'end') textResult.insert(tk.END, result)
# リターンキーを押したときの処理 def callback(event): search_dic()
# 画面を作成 root = tk.Tk() root.title("英和辞書") root.geometry("600x600") # フレーム作成 frame = tk.Frame(root) frame.pack()"side='left'" を使って、Label, Entry, Button が横並びになるようにしました。検索ボタンが入力ボックスとくっつきすぎたので、"padx=16, pady=16" を使って上下左右の間隔を調整しました。
# フレームの中のパーツ labelWord = tk.Label(frame, text='英単語: ', font = ("VL Gothic", 14)) labelWord.pack(side='left') entryWord = tk.Entry(frame, font = ("VL Gothic", 14)) entryWord.pack(side='left') buttonClick = tk.Button(frame, text='検索') buttonClick["command"] = search_dic buttonClick.pack(side='left', padx=16, pady=16)「検索」ボタンを押さなくてもよいように、次を加えました。
# リターンキーを押した場合 root.bind('<Return>', callback)結果の表示画面は次のとおりです。テキストボックスは最初 "tk.Text" を使いました。ボックスに入りきらないテキストはスクロールできますが、スクロールバーがついているほうが、わかりやすいので、"scrolledtext.ScrolledText" に替えました。
# スクロールバーの付いたテキストボックス textResult = scrolledtext.ScrolledText(root, wrap = tk.WORD, width = 60, height = 20, font = ("VL Gothic", 14)) textResult.pack()
# 画面を動かす root.mainloop()
$ sudo apt install python3-pandas
last_name,first_name,address,city,phone,email,comments Smith,John,123 New Way,"Orange, CA 92867-2040",123-456-7890,jsmith@gmail.com,Zotac Co.それで、python では read_csv() を使い、次のように記述しました。
import sqlite3 import pandas as pd # csvファイルをデータフォームに取り込む df = pd.read_csv('myaddressbook.csv')次にデータベース myaddressbook.sql とテーブル contacts を作り、to_sql() でデータフォームを書き込みました。
# データベースを作成する conn = sqlite3.connect('myaddressbook.sql') # sqliteを操作するカーソルオブジェクトを作成 cur = conn.cursor() # テーブル contacts に、読み込んだデータフォームを書き込む # if_existsで、もしすでにテーブルが存在していたら、書き換えるように指示 df.to_sql('contacts', conn, if_exists='replace')最後に終了を宣言して終わりです。
cur.close() conn.close()
table|contacts|contacts|2|CREATE TABLE "contacts" ( "index" INTEGER, "last_name" TEXT, "first_name" TEXT, "address" TEXT, "city" TEXT, "phone" TEXT, "email" TEXT, "comments" TEXT )私は、SQLite データベースをグラフィカルに操作出来る DB Browser SQLite を apt で導入し、重宝しています。これには、データベースから CSV へのエクスポート機能はあるのですが、SCV からデータベースへのインプット機能はありません。それで、自作の CSV から SQLite データベース変換ツールが役立っています。
$ sudo apt update $ sudo apt install wordpress php libapache2-mod-php mysql-server php-mysql
Alias /blog /usr/share/wordpress <Directory /usr/share/wordpress> Options FollowSymLinks AllowOverride Limit Options FileInfo DirectoryIndex index.php Order allow,deny Allow from all </Directory> <Directory /usr/share/wordpress/wp-content> Options FollowSymLinks Order allow,deny Allow from all </Directory>これを有効にするため、以下のコマンドを実行しました。
$ sudo a2ensite wordpress $ sudo a2enmod rewrite $ sudo systemctl restart apache2
データベース名 wordpress ユーザ名 wordpress@localhost パスワード penguinルートユーザで MySQL に入りました。
$ sudo mysql -u rootMySQL のプロンプト mysql> が表示されましたので、まず、データベースを作成しました。
mysql> CREATE DATABASE wordpress;それからユーザにデータベースにアクセスする権限を与えるのですが、上記の手順には次のように書かれていました。
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,ALTER -> ON wordpress.* -> TO wordpress@localhost -> IDENTIFIED BY 'penguin';ところが、何度やってもエラーとなりました。MySQL のバージョン8 以上では、上記の方法は使えず、まず、ユーザを作ってから、そのユーザに権限を与えなければなりませんでした。私は、以下の方法で成功しました。
mysql> CREATE USER 'wordpress'@'localhost' IDENTIFIED BY 'penguin'; -> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,ALTER -> ON wordpress.* -> TO wordpress@localhost;変更を即座に反映させるため、次のコマンドを使いました。
mysql> FLUSH PRIVILEGES;ユーザに権限が正しく与えられているかどうかを、次のコマンドで確かめました。
mysql> SHOW GRANTS FOR wordpress@localhost;間違えていたら
mysql> REVOKE SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,ALTER ON wordpress.* from wordpress@localhost;などとして、もとにもどせます。MySQL の設定はこれで終わりですので、
mysql> quitで終了しました。
$ sudo mousepad /etc/wordpress/config-localhost.php以下のように書きました。
<?php define('DB_NAME', 'wordpress'); define('DB_USER', 'wordpress@localhost'); define('DB_PASSWORD', 'penguin'); define('DB_HOST', 'localhost'); define('DB_COLLATE', 'utf8_general_ci'); define('WP_CONTENT_DIR', '/usr/share/wordpress/wp-content'); ?>それから、これは上記の手順にはなかったことですが、/usr/share/wordpress/wp-config-sample.php を同じディレクトリーに wp-config.php としてコピーし、これにデータベース名、データベースユーザ名、データベースパスワードを書き込み、次の行を加えました。
define('WP_ALLOW_REPAIR', true);こちらのファイルでは config-localhost.php と違って、データベースユーザ名を wordpress@localhost としたら、データベースに接続できなかったので wordpress とだけしました。
$ sudo a2enmod userdirまた python を使うため
$ sudo a2enmod pythonも必要です。そして、apache2 を再起動しました。
$ sudo systemctl restart apache2
<IfModule mod_userdir.> UserDir public_html UserDir disabled root <Directory /home/*/public_html> AllowOverride FileInfo AuthConfig Limit Indexes Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec ExecCGI Require method GET POST OPTIONS </Directory> </IfModule>
$ chmod 755 *.cgiこれで ~/public_html でも CGI が動くようになりましたが、SQLite データベースに書き込み権限を与えても、「データベースは Read Only です」とのエラーメッセージが出ましたので、~/public_html の属性を 777 にして解決しました。実際には、データベースを ~/public_html/sqlite3_database などに配置して、sqlite3_database の属性を 777 にしたほうが安全かと思います。
import cgi import cgitb cgitb.enable() form = cgi.FieldStorage() id_number = form.getvalue('id_number') last_name = form.getvalue('last_name') first_name = form.getvalue('first_name') address = form.getvalue('address') city = form.getvalue('city') phone = form.getvalue('phone') email = form.getvalue('email') comments = form.getvalue('comments')
sql_command = "INSERT INTO contacts VALUES(?,?,?,?,?,?,?,?)" conn.execute(sql,(id_number,last_name,first_name,address,city,phone,email,comments,)) conn.commit() conn.close()conn.commit() を忘れると、データベースファイルには書き込まれません。
sql ='''UPDATE contacts SET [last_name]=?, [first_name]=?, [address]=?,[city]=?, [phone]=?, [email]=?, [comments]=? WHERE [contact_id]={}'''.format(index_number) conn.execute(sql,(last_name,first_name,address,city,phone,email,comments,)) conn.commit() conn.close()
sql = "DELETE FROM contacts WHERE [contact_id]=?" conn.execute(sql,(index_number,)) conn.commit() conn.close()
def search_show(index_number): # データベースへ接続する conn = sqlite3.connect("abook.sqlite3") # カーソール・オブジェクトの生成 cur = conn.cursor() # SQLを実行してデータを取り出す sql = "SELECT * FROM contacts WHERE [contact_id]=?" rows = cur.execute(sql, (id_number,)) key = 0 for row in rows: key = len(row) if key: print('''<form action='abook_save.cgi' method='post'> <table> <tr><td>INDEX</td><td><input type='text' readonly='readonly' name='index' value='{0}' /></td></tr> <tr><td>Last Name</td><td><input type='text' name='last_name' value='{1}' /></td></tr> <tr><td>First Name</td><td><input type='text' name='first_name' value='{2}' /></td></tr> <tr><td>Address</td><td><input type='text' name='address' value='{3}' /></td></tr> <tr><td>City/State/ZIP</td><td><input type='text' name='city' value='{4}' /></td></tr> <tr><td>Phone</td><td><input type='text' name='phone' value='{5}' /></td></tr> <tr><td>Email</td><td><input type='text' name='email' value='{6}' /></td></tr> <tr><td>Comments</td><td><input type='text' name='comments' value='{7}' /></td></tr> </table>'''.format(row[0],row[1],row[2],row[3],row[4],row[5],row[6],row[7])) conn.close() return(key)データ行のデータ数を len(row) でチェックして key に代入し、key が 0 の場合はデータを表示させず、メインルーチンで「その番号のデータはありません」というメッセージを表示させるようにしました。メインルーチンは次のとおりです。
key = search_show(index_number) if key: print('''<br /><br /> <input type='submit' value='保存' /> </form>''') else: print('''</form> <p>この番号のデータはありません</p> <br/><br/>''') print('''<form><input type='button' onclick='history.back()' value='もどる' /></form>
# SQLを実行してデータを挿入する sql = "DELETE FROM contacts WHERE [index]=?" try: conn.execute(sql,(index_number,)) conn.commit() conn.close() print('<p>データを削除しました</p>') except sqlite3.Error as e: print('sqlite3.Error occurred:', e.args[0])try: で失敗したら except でエラーを表示させるという書式を使いました。これは、プログラムの制作過程で役にたちました。
firefox <住所録 CGI への URI>とし、ワンクリックで住所録が起動するようにしました。
def search_show(search_word): conn = sqlite3.connect("ejdict.sqlite3") cur = conn.cursor() rows = cur.execute('SELECT * FROM items WHERE word LIKE ? LIMIT 254',(search_word,)) for row in rows: print("<p><font id='index'>{}</font> {}</p>".format(row[1],row[2]) conn.close()
font#index { font-size:16pt;font-weight:bold;color:darkred; } p { margin:0.5em 0;padding-left:1em;text-indent:-1em; }まず、見出し語をサイズの大きな太文字にし、色も変えて、見やすくしました。それから、印刷本の辞書のように、見出し語が 1文字飛び出るようしました。つまり、改行された 2行目以降に 1文字分のインデントをつけました。とても見やすくなりました。WEB アプリでは CSS を使って、こうしたことが簡単にできます。
Peter Smith Las Vegas, AZ Dwight Hutchenrider Orland, FLのようにではなく
Peter Smith Las Vegas, AZ Dwight Hutchenrider Orland, FLのように項目の区切りをそろえて表示する工夫をしてみました。
print('<span class='name_block'>{}</span> <span class='city_block'>{}</span><br />'.format(the_name,the_city))そして、CSS に次のように定義しました。
.name_block { display:inline-block; width:5em; overflow:hidden; white-space:nowrap } .city_block { display:inline-block; width:10em; overflow:hidden; white-space:nowrap }これで、名前は 5em の inline-block の中に、住所(市と州)は 10 em の inline-block の中に入ります。overflow:hidden; で、名前や住所が、その中におさまりきらない場合、途中でカットされるようして、項目ごとの桁ぞろえを実現しました。
$ libreoffice --headless --convert-to txt SAMPLE.odt
$ libreoffice --headless --convert-to html SAMPLE.odt $ html2text SAMPLE.odt > SAMPLE.txt
application/epub+zip; application/x-mobipocket-ebook; application/vnd.amazon.mobi8-ebook; application/x-fictionbook+xml; application/x-zip-compressed-fb2; application/vnd.comicbook+zip; application/vnd.comicbook-rar; application/x-cb7; application/x-cbt; text/plain; x-scheme-handler/opds;ページめくりのアニメーションこそありませんが、見開きページの真ん中に影をつけたりして、実際の本のように見せることができます。日本語インターフェースは用意されていませんが、日本語にも対応し、一応縦書きやルビにも対応します。縦書きの場合、シングル・コラムにし、マウスのスクロール・ホィールで章をえらび、右側のバーを動かしてページ送りをしなければならないこともあり、通常のマウス・クリックや「N」(次ページ)「P」(前ページ)では、うまくページ送りができないことがあります。Calibre の Ebook-viewer よりも洗練され、検索、ハイライト、辞書、翻訳など、様々な機能があります。
Home | First | Prev | Next | Last |