電子書籍を出版してみた(Kindle Direct Publishing編)

電子書籍元年(←毎年言われている)に向けての活動

 電子書籍を出版してみた(Kindle Direct Publishing編)

iBooksの方が簡単だけど、やっぱりAmazonでの出版してみたいと思い、KDP(Kindle Direct Publishing)を試してみる。

執筆活動

EvernoteとMarkedをうまく活用し、マークダウン記法で執筆。小説用にスタイルシートもいじりまくっています。

EPUB変換(md -> epub)

電書ちゃんねる様の神サービスでんでんコンバータを用いて、EPUBファイルを作成する。すごい完璧にできる。

MOBI変換(epub -> mobi)

EPUB業界標準に対して、AmazonではEPUBを拡張したMOBIファイルを利用している。Kindle プレビューツールを使って変換と各端末でのプレビュを確認する。

ただし、Kindleプレビューツールはあまりいけてなく、Kindle PaperWhiteKindle for iOSは正常に動作しない。もしかしたら私のスタイルシートがダメなのかも知れないが、Kindle Fire HDで動くことを確認したのでOKとする。

そもそもKDPはEPUBでの登録を許容しているので、この作業は不要かも。今回もEPUBで登録しています。

KDPの登録

正直良くわからなかったけど、勢いでうまく言った。日本語にも対応しているのでなんとかなるかと思います。途中でAmazonは米国企業なので米国で徴税されるのを免除する件があったけど、ガン無視

本の出版

流れに沿ってやればなんとかなる感じ。ロイヤリティは35%、値段は0.99$にして販売。登録後は審査(レビュー)に数日かかると言われたが、半日くらいでOKができた。

My First Publishing by Amazon

できた〜超嬉しい!

リスタート by Amazon Amazon のページ

おまけ

ついでに本の紹介ページも作ってみた。こちらも電書ちゃんねる様のでんでんランディングページを利用した。本の広告に最適なTumblrのテーマです。

ランディングページ(本の紹介ページ) ランディングページ(本の紹介ページ)

次回予告

マーケティングに関して少し、考えてみようかしら。

  • ランディングページの設定をもっといじる
  • 以前作成したTwitterBotで自動宣伝をさせる(かなりうざい 笑)

以上

【追加情報】markedを用いてEvernote上でMarkdown記法の即時プレビュを実現する

【追加情報】markedを用いてEvernote上でMarkdown記法の即時プレビュを実現する

仕組みを作りこんでる場合は、用意にappのアップデートはできないな。

困ったこと

以前用意したEvernote + markedの環境がOSやappをアップデートした関係で動かなくなった。

環境

原因

ネット上に情報がなかったのだが、潜って見るといろいろわかった。簡単に言うとEvernoteにおけるノートのローカル保管場所等が変更になったことが原因。具体的には、

  • ${HOME}/Library/Application Support/com.evernote.Evernote/accounts/www.evernote.com/${ACCOUNT}/content
  • 上記${ACCOUNT}は以前はユーザ名だったが、数字7文字に置き換わった(セキュリテイの関係)
  • 以前はcontent.htmlだったのが、content.enmlに変更になった。

修正方法

以前作成したシェルを以下の用に修正する。あとはAutomatorでapp化して終了

ACCOUNT=“数字7桁"         # your evernote account name
CHECK_INTERVAL=2          # content update check interval (sec)
MARKED_REFRESH_BG=yes     # [yes/no] yes:background, no:background
VERBOSE=no                # [yes/no] yes:check result output, no:silent


CONTENT_DIR="${HOME}/Library/Application Support/com.evernote.Evernote/accounts/www.evernote.com/${ACCOUNT}/content"
CONTENT_HTML=content.enml # read file
CONTENT_MD=content.md     # write file


while true;
do
  LATEST_DIR=`stat -l -t '%FT%T' "${CONTENT_DIR}"/* | cut -d' ' -f6- | sort | tail -1 | cut -d' ' -f2-`
  NEW_HASH=`md5 "${LATEST_DIR}/${CONTENT_HTML}" | cut -d= -f2`
  if [ "${HASH}"x == "${NEW_HASH}"x ]; then
    test "${VERBOSE}"x == "yes"x && echo "content not been updated."
    sleep ${CHECK_INTERVAL}
    continue
  fi

  HASH=${NEW_HASH}
  cat "${LATEST_DIR}/${CONTENT_HTML}" | sed -e 's/<img src=\"\([^"]*\)\"[^>]*>/![](\1)/g' | textutil -stdin -format html -convert txt -stdout >"${LATEST_DIR}/${CONTENT_MD}"
  test "${VERBOSE}"x == "yes"x && echo "content updated, refresh markdown."
  open -a Marked "${LATEST_DIR}/${CONTENT_MD}" $(test "${MARKED_REFRESH_FG}"x != "yes"x && echo '-g')
  sleep ${CHECK_INTERVAL}
done

ちなみにtextutil -stdin -format html -convert txt -stdoutの箇所も修正した。textutilのオプションで、-format htmlを明示している。enmlファイルはhtmlとは微妙に違うみたいだ。

おまけ そもそもenmlってなに?

ENML

 ENML とは、Evernote ノートの記述に使用されるマークアップ言語です。ENML は XHTM ベースの言語るため、Evernote ノート内のリッチコンテキストを容易に表現できます。

以上です。

Macで.net Frameworkを利用した開発

 Mac.net Frameworkを利用した開発

VB.netで開発をする後輩に対して).netなんて簡単だよ!俺、得意分野だし!!

こっそりと復習(予習?)をします。けどよくよく考えたら、Windows環境ないことに気付いたため、なんとかする。

Xarmarinのインストール

Xarmarinはざっくり言うと以下のような製品です。

私が学生の頃はMono(たぶんver2.0のころ)は全然な印象だったけど、時代は進んでいるんですね。インストーラに従い、インストールします。

Xarmarin

Hello VB.net on Xarmarin

早速、VB.netのアプリを作ってみる。まずは、新規ソリューションの作成から。

Hello VB.net

Windowアプリのガラだけ自動構築できたので、適当に実行してみる。すると下記のようなエラー

/Library/Frameworks/Mono.framework/Versions/3.8.0/lib/mono/4.5/Microsoft.VisualBasic.targets: Error: Error executing task Vbc: Argument cannot be null.
Parameter name: pathToTool (HelloVBNETonXamarin)

意味不明です。自動生成だけで、こけると困ります。ググると中の人(Michael氏)のコメントが有りました。

VBのエラーの原因

ざっくり訳すと、

XarmarinはVB.netには完全に対応はしていないよ。(中略)C Sharpを利用することを勧めるよ!

なんてこったい\(^o^)/

返せ、俺の数時間を返せ。

Hello C Sharp on Xarmarin

このまま引き下がるのも癪なので、Michael氏のrecommendに従い、C#で作ってみる。

MainWindow.cs

なんか俺の知ってるFormアプリケーションとは形が違うな。Gtkを使っているから?まあいいや、だいたい同じだろう。

  • ボタンとラベルを配置
  • ボタンにonClickイベントを定義
  • onClik押下時にラベルの文章を変更 labelHello.Text = "Hello C Shrap on Xamarin"; 
using System;
using Gtk;

public partial class MainWindow: Gtk.Window
{
    public MainWindow () : base (Gtk.WindowType.Toplevel)
    {
        Build ();
    }

    protected void OnDeleteEvent (object sender, DeleteEventArgs a)
    {
        Application.Quit ();
        a.RetVal = true;
    }

    protected void OnButtonHelloClicked (object sender, EventArgs e)
    {
        labelHello.Text = "Hello C Shrap on Xamarin";
//thrownewNotImplementedException();
    }
}

できたアプリ

大したことはしてないけど、MacでCSharpのアプリが動くのはすごいな。

MainWindow_01

MainWindow_02

以上。たぶんこの続きはありません。

TwitterBotをRubyで作る

TwitterBotをRubyで作る

本物のTwitterアカウントでテストするなし

今更ながらBotを作ってみた。何に使うかはまだ秘密!

参考

この本に書いてあることのまんまです。

twitter_bot.rb

コード

require 'rubygems'
require 'twitter_oauth'

CONSUMER_KEY = ‘***'
CONSUMER_SECRET = ‘***'
ACCESS_TOKEN = ‘***'
ACCESS_TOKEN_SECRET = ‘***'

client = TwitterOAuth::Client.new(
     :consumer_key => CONSUMER_KEY,
     :consumer_secret => CONSUMER_SECRET,
     :token => ACCESS_TOKEN,
     :secret => ACCESS_TOKEN_SECRET
)

posts = [
     "hoge",
     "piyo",
     "huga",
     "hogehoge",
     "piyopiyo",
     "hugahuga",
]

post = "[自動投稿] [テストだから気にしないで] " + posts[rand(posts.size)]
status = client.update(post)
puts ("#{Time.now} #{post}")

ざっくり説明

  • CONSUMER_KEY,CONSUMER_SECRET,ACCESS_TOKEN,ACCESS_TOKEN_SECRETTwitterアカウント毎に事前に用意する(ググれば分かる)

  • 配列postsにはこのボットにつぶやかせる内容を列挙しておく。ビバ!ハードコーディング!(ヒアドキュメントといえば聞こえはいい)

  • つぶやき内容はランダムにしている。つぶやく周期は後述のcronで制御。

  • client.updateでつぶやきを投稿。例外処理を全くやっていない。戻り値statusで制御すべきだけど、面倒だからやらない。たぶん大丈夫。おそらくWiFiが切れてたら例外が出るんだろうな。

スケジューラ(cron)

crontab

# TwitterBot
0 * * * * /usr/bin/ruby /Users/7010oncajon/Documents/Programing/Ruby/TwitterBot/twitter_bot.rb >> /Users/7010oncajon/Documents/Programing/Ruby/TwitterBot/twitter_bot.log 2>&1

ざっくり説明

  • 1時間周期でつぶやくなう
  • ログ出力の方法ってこれでいいんだっけ?

以上

markdownで数式を表示する

markdownで数式を表示する

どんどんTexに近づいていく件に関して

困ったこと

markdownでEvernoteやブログを書いているが数式を書きたくなった。

前提

解決方法

Marked

Markedの設定よりMathjaxを有効にする

IMG01

はてなブログ

以下の記事を参考にMathjaxを有効にする。

はてなブログで MathJax αβγ

確認

美しい。。。

入力

\\[
{e}^{i\pi} + 1 = 0
\\]

結果

\[ {e}^{i\pi} + 1 = 0 \]

以上

システムエンジニア 無謀にもオーディオを語る

システムエンジニア 無謀にもオーディオを語る

オーディオ女子(笑)ハイレゾ音源(笑)

基本的にこのブログは私が作成したもの(主にプログラム)を公開している。あまり評論とかは書きたくはないんだけど、たまにはいいかなって思って。というわけで、最近話題のハイレゾ音源を聴き比べてみる。

オーディオ設備

どやー(ただの自慢)

外観

おしゃれに撮影してみた。

外観

構成

アナログ音源もデジタル音源も一つのアンプ/スピーカを通して出力されるようになります。

No. 役割 機器 値段 備考
1 スピーカ BOSEのなんか それなり 親父殿からパクってきた
2 アンプ 自作 プライスレス 真空管だよ
3 CDプレーヤ どっかの安物 3000円くらい
4 DAC AirMac Ecpress 8000円くらい これを使ってデジタル音源をアナログに変換する

比較対象音源

YouTube Appleロスレス CD ハイレゾ を聴き比べてみる。それぞれの流れは以下の通り。ちなみにハイレゾ音源はe-onkyo musicからWAV形式で購入してます。

オーディオ構成図

聴き比べ

今回、聴き比べたのBill Evans の Waltz for Debby です。Jazzの超超超有名曲を聴き比べてみます。 YouTube

Waltz for Debby

曲に対する薀蓄

姪に捧げたと言われる天国的に美しいメロディを持つBill Evansの名曲。初出はEvansのソロアルバム「New Jazz Conception」だったと思います。

ベースにスコット・ラファロ、ドラムスにポール・モチアンの第一期トリオによる演奏は、ピアノ・トリオの歴史を変えたとまで言われています。簡単に言うとそれまではピアノのが主でベースとドラムスは従(リズムをキープする)だったのが、全員が主として互いに影響を与えならが演奏をする(インタープレイ)になりました。

この演奏では前テーマをピアノとベースがオリジナルの3拍子で引き、アドリブからは4拍子に代わり、ドラムスも加わります。ベースは高音かつ早いパッセージでピアノに絡みついてきます。ドラムスも刻むのではなく常にアドリブのような演奏。緊張感は常にあるが、クールさは最後まで保っている演奏。

確かヴィレッジヴァンガードでのライブ演奏だったと思ういますが、生で聞けた人を心から羨ましく思います。お酒を飲みながら聞くところなので、グラスの音やしゃべり声も若干聞こえます。(エバンスは観客がうるさいので、この録音はあまり気に入っていないとか)

またこの録音から10日後にスコット・ラファロが交通事故で死亡したという悲劇(エバンスは嘆き悲しんだと言われています)もあり、この演奏は大変価値のあるものになりました。

エバンスを含め、さまざまな人が演奏しているのでそちらを聴き比べるのも良いかも。以下、YouTubeより。

さあ、聴き比べよう。

YouTube

はい、最初から期待していませんが、良くないですね。ベース音が響いてこないよ。

Appleロスレス

格段にいいです。スコット・ラファロのベースが響いてきます。無線を通しているので、品質低下があるかと思ったが、気にならないレベルですね。

CD音源

Appleロスレスとおんなじですね。逆に言うと、Appleロスレスすごいな。

ハイレゾ

あれ、そんなに良くないよ。CDより格段にいいってはならないな。むしろ平面的で微妙かも。ハイレゾに対応しているDACやアンプじゃないと効果がないのかな?

まとめ

No. 対象 予測 結果 備考
1 YouTube × ×
2 Appleロスレス
3 CD音源
4 ハイレゾ

最後に

私の環境ではハイレゾの恩恵はなかったです。CDで買ってAppleロスレスにエンコしておけば十分かと。ここまで検証しておいて、あれなんですが、妻が一言、

そもそもこの曲って何十年も前のライブ録音でしょ。元の音源が良くないんだから、ハイレゾも何もないんじゃないの?

はぅ、確かにそのとおりかも。

以上。

ユニケージしてみた。(その5:LV4MAKE編)

ユニケージしてみた。(その5:LV4MAKE編)

 comma-separated values / tab-separated values / space-separated values

Input(LV3データ)

月別に正規化されたデータです。

mba:YOKIN 7010oncajon$ cat DATA/LV3/YOKIN/208703
20870301 60000 _ カード_ENET000000 500000
20870307 30000 _ カード_ENET000001 470000
20870316 5000 _ 電気料 465000
20870319 _ 200000 給料振込_会社名 665000
20870327 3000 _ ガスダイ3ガツ 662000
20870328 1000 _ ゲスイドウ_シヨウリヨウ 661000
20870328 _ 9000 交通費振込_会社名 670000

Prosess(LV4MAKE)

画面に表示するようにデータを整形します。最終的にはDropboxのディレクトリにCSVファイルで出力することで、Webからのアクセスを可能している。処理のポイントは以下

  • LV3の段階で月別になっているので、処理対象の年月をコマンドライン引数で指定
  • 処理の最後にCSVフィアルに整形
  • 支出と収入を同じ列に配置。替わりに区分”支出/収入"追加
  • 画面に表示しない項目(残高)を削除
  • 画面に表示したい項目(No.)を追加
mba:YOKIN 7010oncajon$ cat SHELL/LV4MAKE.YOKIN.MONTH_BALANCE_CSV
#!/bin/bash -vx
#
# LV4MAKE.YOKIN.MONTH_BALANCE_CSV 月別収支SCVのLV4MAKE
#
# usage: LV4MAKE.YOKIN.MONTH_BALANCE_CSV yyyymm
#
# writen by 7010onCajon / Date: 20140709

# ホームディレクトリ
homed=/Users/7010oncajon/Documents/Programing/UNICAGE/YOKIN

# アプリケーションディレクトリ
apd=/Users/7010oncajon/Dropbox/Public/UNICATGE/YOKIN/MONTH_BALANCE

# ログディレクトリ
logd=${homed}/LOG
mkdir -p ${logd}
logf=${logd}/LOG.$(basename $0).$(date +%Y%m%d)
exec 2> ${logf}

# tmpディレクトリ
tmpd=${homed}/TMP
mkdir -p ${tmpd}
tmp=${tmpd}/$$.$(basename $0).$(date +%Y%m%d).$(date +%H%M%S)

# LV3データディレクトリ
lv3d=${homed}/DATA/LV3/YOKIN
mkdir -p ${lv3d}

# LV4データディレクトリ
lv4d=${apd}/DATA/LV4
mkdir -p ${lv4d}

# エラー処理
ERROR_EXIT(){
echo ERROR__ $(basename $0)
rm -f ${tmp}-*
exit 1
}

# 引数の確認
[ $# -ne 1 ] && ERROR_EXIT
tgt_ym=${1}

# LV3データの読み込み
tgt_file=${lv3d}/${tgt_ym}

# 1:年月日 2:お引出し 3:お預入れ 4:お取り扱い内容 5:残高
cat ${tgt_file} |
# 不要カラムの削除
# 1:お取り扱い内容 2:お引出し 3:お預入れ
self 4 2 3 |
# 収支区分および収支の作成
# 1:収支区分 2:お取り扱い内容 3:収支
awk '{
if($2=="_"){
print "収入", $1, $3
}else{
print "支出", $1, $2
}
}' |
# お取り扱い内容毎に集計を行う
# 1:終始区分 2:内容 3:収支
LANG=C sort -k1,2 |
sm2 1 2 3 3 |
# ソートを行う
LANG=C sort -k1,1 -k3,3nr |
# 通し番号(No.)を付与する
# 1:No. 2:収支区分 3:内容 4:収支
juni |
# CSVヘッダーの付与
awk '
BEGIN{print "no.", "balance_code", "content", "balance"}
{print $0}
' |
# 区切り文字を,(カンマ)に変更
awk 'BEGIN{OFS=","}{print $1, $2, $3, $4}' |
# ファイル出力
# 1:No.,2:収支区分,3:内容,4:収支
cat > ${lv4d}/${tgt_ym}.csv
[ $(plus ${PIPESTATUS[@]}) -eq 0 ] || ERROR_EXIT
echo SUCCESS $(basename $0)
rm -f ${tmp}-*
exit 0

juniコマンド

ユニケージにはちょっと嬉しいコマンドが用意されてるな。

mba:YOKIN 7010oncajon$ man2 juni

Tukubaiオンラインコマンドマニュアル

juni(1)

【名前】

juni : 同一キー内での順位を出力

【書式】

Usage   : juni [<k1> <k2>] <file>
        : juni -h [<k1> <k2>] <file>
Version : Thu Dec 15 13:46:38 JST 2011

【説明】

第<k1>フィールドから第<k2>フィールドまでをキーフィールドとして、同一キーの行ど
うしにおける順位を行の先頭に挿入する。<k1> <k2>を指定しないときは、すべての行が
同一キーとみなすものとする。この場合は単純に行の先頭に行番号を挿入するのと同じ
になる。

-hオプションを指定した場合、各キーフィールドの順位を階層的に出力する。<file>を
指定しない、あるいは、-が指定された時には標準入力からのデータ入力を期待する。

Output(LV4DATA)

csvので出力出来ました。

mba:YOKIN 7010oncajon$ cat /Users/7010oncajon/Dropbox/UNICATGE/YOKIN/MONTH_BALANCE/DATA/LV4/208703.csv
no.,balance_code,content,balance
1,収入,給料振込_会社名,200000
2,収入,交通費振込_会社名,9000
3,支出,カード_ENET000000,60000
4,支出,カード_ENET000001,30000
5,支出,電気料,5000
6,支出,ガスダイ3ガツ,3000
7,支出,ゲスイドウ_シヨウリヨウ,1000

次回はこのCSVファイルをD3.jsを用いて読み込み、支出と収入のバランスをあらわす円グラフを作成します。

以上