電子書籍を出版してみた(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 PaperWhite
やKindle for iOS
は正常に動作しない。もしかしたら私のスタイルシートがダメなのかも知れないが、Kindle Fire HD
で動くことを確認したのでOKとする。
そもそもKDPはEPUBでの登録を許容しているので、この作業は不要かも。今回もEPUBで登録しています。
KDPの登録
正直良くわからなかったけど、勢いでうまく言った。日本語にも対応しているのでなんとかなるかと思います。途中でAmazonは米国企業なので米国で徴税されるのを免除する件があったけど、ガン無視
本の出版
流れに沿ってやればなんとかなる感じ。ロイヤリティは35%、値段は0.99$にして販売。登録後は審査(レビュー)に数日かかると言われたが、半日くらいでOKができた。
My First Publishing by 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 とは、Evernote ノートの記述に使用されるマークアップ言語です。ENML は XHTM ベースの言語るため、Evernote ノート内のリッチコンテキストを容易に表現できます。
以上です。
Macで.net Frameworkを利用した開発
Macで.net Frameworkを利用した開発
(VB.netで開発をする後輩に対して).netなんて簡単だよ!俺、得意分野だし!!
こっそりと復習(予習?)をします。けどよくよく考えたら、Windows環境ないことに気付いたため、なんとかする。
Xarmarinのインストール
Xarmarinはざっくり言うと以下のような製品です。
- .net FrameworkをWindows以外でも動作させるMonoというフレームワークがある
- それのEDI環境としてMonoDevelopというものがあった。
- MonoDevelopでiOSやAndroidの開発をできるようにしたものがXamamarin
私が学生の頃はMono(たぶんver2.0のころ)は全然な印象だったけど、時代は進んでいるんですね。インストーラに従い、インストールします。
Hello VB.net on Xarmarin
早速、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氏)のコメントが有りました。
ざっくり訳すと、
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のアプリが動くのはすごいな。
以上。たぶんこの続きはありません。
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_SECRET
はTwitterアカウント毎に事前に用意する(ググれば分かる)配列
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で数式を表示する
システムエンジニア 無謀にもオーディオを語る
システムエンジニア 無謀にもオーディオを語る
オーディオ女子(笑)ハイレゾ音源(笑)
基本的にこのブログは私が作成したもの(主にプログラム)を公開している。あまり評論とかは書きたくはないんだけど、たまにはいいかなって思って。というわけで、最近話題のハイレゾ音源を聴き比べてみる。
オーディオ設備
どやー(ただの自慢)
外観
おしゃれに撮影してみた。
構成
アナログ音源もデジタル音源も一つのアンプ/スピーカを通して出力されるようになります。
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
曲に対する薀蓄
姪に捧げたと言われる天国的に美しいメロディを持つBill Evansの名曲。初出はEvansのソロアルバム「New Jazz Conception」だったと思います。
ベースにスコット・ラファロ、ドラムスにポール・モチアンの第一期トリオによる演奏は、ピアノ・トリオの歴史を変えたとまで言われています。簡単に言うとそれまではピアノのが主でベースとドラムスは従(リズムをキープする)だったのが、全員が主として互いに影響を与えならが演奏をする(インタープレイ)になりました。
この演奏では前テーマをピアノとベースがオリジナルの3拍子で引き、アドリブからは4拍子に代わり、ドラムスも加わります。ベースは高音かつ早いパッセージでピアノに絡みついてきます。ドラムスも刻むのではなく常にアドリブのような演奏。緊張感は常にあるが、クールさは最後まで保っている演奏。
確かヴィレッジヴァンガードでのライブ演奏だったと思ういますが、生で聞けた人を心から羨ましく思います。お酒を飲みながら聞くところなので、グラスの音やしゃべり声も若干聞こえます。(エバンスは観客がうるさいので、この録音はあまり気に入っていないとか)
またこの録音から10日後にスコット・ラファロが交通事故で死亡したという悲劇(エバンスは嘆き悲しんだと言われています)もあり、この演奏は大変価値のあるものになりました。
エバンスを含め、さまざまな人が演奏しているのでそちらを聴き比べるのも良いかも。以下、YouTubeより。
- CD音源
- ライブ映像(ベースとドラムスは別の人です、確か)
- オリジナルのピアノ・ソロ
- ヨーロッパの歌姫、モニカ・ゼッターランドとの共演
- キャノンボール・アダレイによるサックス。一気にファンキーになる(笑)
- オスピーのピアノ・トリオ。やっぱりファンキーになる(笑)
- 晩年の電気ピアノ(フェンダー・ローズ)による演奏。かなりノリノリ
- 土岐麻子によるカバー、確かなんかのCM
さあ、聴き比べよう。
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を用いて読み込み、支出と収入のバランスをあらわす円グラフを作成します。
以上