Pythonを何も知らない状態から始めたこのブログもついに初投稿から3年も経ちました。毎回1年毎に運営数字をまとめると共に、これまでの振り返りを行っていました。3回目も同じように読者の気になるPV数やあの数字をまとめてみたいと思います。
こんにちは。wat(@watlablog)です。もう3年経ったんですね〜。いつも通り所感と数字のまとめを行います!
いつも通り、前半は筆者のこれまでの振り返りを書きます。そのため色々な数字が気になる方は是非目次からジャンプしてみてください!
しかし、「自分も技術ブログを始めてみたい」、「技術ブログはやっているけど他の人がどう思って書いているのか知りたい」という方は前半の文章も参考になると思います。
技術ブログはスキルUPにもナレッジ蓄積にも良いのでみんなやった方が良いよ、といういつも通りの結論になるのですが、実際に続いている人の感想は結構価値がありそうなのでメモしておきます。
技術ブログを3年間続けたらどうなったかをまとめてみる
プログラミングへの抵抗感がなくなった
そもそもこのブログはプログラミングをほとんどしたことのなかった筆者が、これではマズいと思ってぼちぼち始めたことがきっかけです。
Excel VBAやローコードプログラミング(LabVIEWとか商用ソフトに付いているマクロ機能)はできたものの、 書けるプログラムはかなり偏りが大きく、自由に使いこなせるレベルとは程遠いものでした。
Pythonは様々な分野で活用されライブラリも豊富、日本語のドキュメントも豊富なので初心者にやさしい言語です。さらに文法も比較的わかりやすく、思い立った技術計算を簡単に実装できるという点でブログテーマに選んで正解だったと思います。
CS(Computer Sciense)を学んだ人と同等レベルでしっかりとしたコードを書くにはまだ高い壁を感じていますが、ブログを続けることでプログラミングへの抵抗感がなくなったのは大きなメリットです。
スキルアップができた
資格取得
3年間ブログを続ける中で、以下の資格や検定を取得することができました。ブログをしていなかったら取得のモチベーションを得られなかったと思います。
学ぶ資格は保有すること自体よりもどんな知識を身に付けたいかで選べば、直接スキルアップになると思います。
以下の資格、検定はPythonとも相性が良いので、Pythonistaにおすすめです。
- G検定
この検定は機械学習やディープラーニングのジェネラリストとして相応しいかを認定する検定です。
古典的な機械学習からディープラーニングの基礎を体系的に学ぶ機会としてかなり勉強して良かったと思いました。
合格の感想は「【G検定】G2020#1に合格したので対策方法と感想を書いてみた」にまとめています。 - AI実装検定(A級とS級)
こちらもAI系です。A級は「【朗報】G検定取得者がノー勉でAI実装検定A級に合格した件」にまとめた通りG検定と範囲がラップすることもあり、比較的容易に取得することができました。
しかしS級は画像処理に関するかなり深いコーディング理解が必要なのと、ディープラーニング実践コードの穴埋め問題が厳しいので苦戦しました。「AI実装検定S級に合格したので勉強方法と試験内容を振り返る」にまとめた通り、第1回試験のシラバスや出題形式に助けられた感があるので、もう一度受けたら落ちるかも知れません(今は問題形式が違うらしいです)。 - 計算力学技術者試験(振動1級と2級)
この試験は本業でやっているシミュレーション関係の技能を認定するもので最近取得しました。
日本機械学会が主催団体なだけあってガチで難しく、学習期間は数ヶ月にもおよびました。
「計算力学技術者試験1級と2級(振動)を同時に受験して合格した感想」でまとめた通り、Pythonによる計算検証をおおいに活用してめでたく合格しました。
本業への活用
技術ブログを書く最大の魅力は、記事作成に費やした時間がそのまま本業のスキルアップに繋がる所です。
「ブログ」は本来好きなことを書いて楽しむのが目的だと思いますが、もしかしたら「副業」、「アフィリエイト・広告収入」のようなイメージがついて結構胡散臭さを醸し出す場合があります。
稼ぎ目的のブログだと多くの時間を使って書きたくもない内容の記事を量産することになり、さらに記事の寿命も短くなりがちです。
稼げないブログとわかって記事更新をやめると、文章力の向上はあるかも知れませんが費やした時間コストに対するリターンがあまりありませんし、本業の集中力も低くなる懸念があります(人によりますが)。
一方、「技術ブログ」はコンプライアンスに気を付ければ本業関連で気になったことを調べてまとめることができます。記事にまとめるというのは思ったより難しく、内容をよく理解していないと文章が出てきません。
まとめていく過程で多くの場合再調査が必要であるため、必然的に体系的な知識となって本業へ活用できます。
実際3年間ブログをまとめてきた感想としては、記事で検討済・考察済の内容が増えてきたおかげで色々な作業がスピードアップしてきた感覚はあるので、やっていて良かったかも知れません。
仕事以外の時間で技術ブログを書くことについて
たまに「仕事以外の時間で仕事の勉強をするのはちょっと…」という意見もありますが、ライフワークバランスは人それぞれと思います。
プロのアスリートはトレーニング以外の日常生活にも気を払い、囲碁のプロ棋士は対局以外で昼夜を問わず猛勉強しています。また、IT系エンジニアは日進月歩する最新の技術についていくために日ごろから論文を読んだり勉強会を開催する文化があるようです。
何かのプロになる一つのツールとして、技術ブログが選択肢にあっても良いと思いました。
文章を書くのが苦にならなくなった
3年もブログをやっていると、文章力が少しばかり向上するメリットもあるのではないかと思いました。質はどうあれ少なくとも、色々な場面で文章を書くのが全く苦ではなくなったと言えます。
プログラミング系の記事を書くにあたり、ただコードを載せるだけで何の解説もないページにはしたくないと思って前半に技術解説や必要性の説明、後半にコード紹介というスタイルを一貫してきました。
コード部分を後半にすることでページを最後までスクロールしてくれるだろうというコソクな作戦なのですが、記事作成は主に前半部分に時間がかかっています。
解説部分はコードをどんな目的で使うのか、どこがポイントなのかを読者に伝えるよう何度も推敲するので、この3年間で相手に何を伝えたいのかを考えるくせはついたのかなと感じています。
技術職でもレポートを書いたりマニュアルを書いたり…文章は頻繁に書きます。
ダメなレポートの書き方は、自分がやったことをただ述べるだけで読者(配布先や上司)に何をしてほしいかを書かないことだと思いますが、ブログでこの辺のスキルアップができると思います。
自分の知識のデータベースができてきた
検索窓の設置
ブログ記事を書くことで自分の知識を棚卸ししてデータベースのように活用することも可能です。当ブログは3年間で記事数が240記事を超えましたが、正直全ての内容を覚えていることはできません。
しかし書いたことはかろうじて覚えているので、自分の書いた記事を見直せば知識を再インストールできます。
3年継続して記事数が増えてくると、自分の記事を探すのにもかなり苦労します。
そのため当ブログでは検索窓を設置しています。何か気になるキーワードがあれば記事のタイトルだけでなく、本文も含めた検索ができるので、是非読者の皆様もご活用ください。
検索窓はWordPressのテーマを少しいじって配置させています!
カテゴリページを整理
また、ページの上部にカテゴリページへのリンクを配置していますが、これもWordPressテーマデフォルトのカテゴリページではありません。
デフォルトだと記事を作成した順にリストされるだけなので、ここでは別途固定ページに手動による見出し(h1〜h4)を付けてまとめています。
Python, 信号処理, 画像処理, AI, 工学, Web/SNSの各固定ページで目次によるページ内項目リンクをつけることで、アクセシビリティ向上を狙っていますが…どうだろうもっと良い方法があるのかな?
インターネットが繋がる環境であれば、いつでもどこからでもこれらの知識にアクセスできるので、技術ブログは自分の知識をクラウド環境にアップロードしているようなものだと思います。
インターネットが壊れたら使い物になりませんが…(一番保存がきくのは石版かな)。
3年程度だとまだまだな感じですが、これからもまずは自分が利用しやすいようにしていく予定です。
副収入でウハウハ…にはならなかった
人によりますが、技術ブログはただやっているだけだと全く稼げません。
当ブログはGoogleアドセンスの自動広告を絞ったりして見やすさを優先し…つまりマネタイズを全然していません。
ブログ開始から3年経ちましたが、待っているだけでは右肩上がりにならないとわかりました(後半にデータを載せます)。
Twitterフォロワーが1000人を超えた
Twitterではそれほど発言しているわけではありませんが、3月3日にちょうどフォロワーさんが1000人になったので記念にスクショしました。
3年もブログをやっていると自然に増えてくるようです。
いつも話しかけてくれる人は限られていてちょっと1000人の効果を感じていないため、気軽にコメント頂けると嬉しいです(初心者質問大歓迎です)。
3年間のブログ運営数字
ここからはお決まりのブログ運営数字を公開します。1年目のようなインパクトがないのと、2年目と異なり右肩上がりではないので多少つまらないかも知れませんが、同じくブログをやっている方の参考になるかと思います。
過去の数字は以下の記事をご覧ください。
Pythonブログを1年続けた結果の運営数字!気になるPVは?
2年続けたPythonブログの運営数字と技術ブログの良い所を紹介
記事数
ブログは2019年4月から開始したので、4月からの1年をFY(Fiscal Year)として集計しました。
まずは総記事数の変化です。総記事数なので当然右肩上がりですが、最終的に241記事まで書くことができました(FY2020の段階で204記事)。
一応毎月の更新はできていますが、記事の内容が難しくなってくることから更新頻度も落ちています。
PV数
続いてPV数です。最大は月間8万PVを記録することができました。その後は下がったり上がったり、最終的には減少傾向になっています。
G検定のカンペ記事が定期的にバズるというのがこれまでずっとありました。しかし最近はその記事のランクが下がってしまったことでPV数の減少につながっていると思います。
バズり記事の寿命変化は明確にあるということがわかった1年でした。
ただし、信号処理や画像処理の初期記事はまだまだPVを稼いでいるので、需要のある記事はバズりはしないものの寿命は長いようです。
ユーザ数
ユーザ数は最大で月間4万人を記録しました。PVと同じ変化をしています。
Google表示回数
Google表示回数は最大で月間54万回を記録しました。
毎度思うのですが、これだけ表示されていて全てクリックされれば月間数十万PVになるんですよね。魅力的なタイトル設定が重要だと改めて思い知らされます。
平均記事ランキング
平均記事ランキング(Googleの何番目に表示されるか)は最も良い時で平均10位でした。その後も10位〜15位をうろうろしています。
収益
収益はFY毎に棒グラフで表すと見にくい絵になってしまったので、2年目の時と同じように全ての期間でプロットしました(AffiliateとAdSenseを分けた方が見やすい)。
基本はAdSenseがメインです。22ヶ月目あたりから自動広告を排除したので、一旦下がっています。
このプロットはあまり夢のあるものではありませんが、サーバ代やドメイン代は十分賄える額になっているので、健全な経営となっているようで良かったです。
これらを経費として差し引いたとしても、他の雑所得と合計して税金の計算はしておいた方が良いでしょう。最寄りの税務署に確認したところ、確定申告が必要でない額だったとしても住民税に変化があるとのことなので。後々追徴課税にならないように…。
おまけ:集計に使ったPythonコード
おまけとして、今回集計に使ったコードを以下に示します。
csvファイルのフォーマット例として、ダウンロード可能にしましたので是非ご参考までに。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 |
import pandas as pd import numpy as np from matplotlib import pyplot as plt def blog_report(filename: str, col_type: str): """ ファイル名と集計対象のデータ種を指定して年間の推移毎にデータ分割する関数 12ヶ月で割り切れないデータでも対応できるよう、余り月のデータ も処理している。 :param filename:集計データの入ったcsvファイルのパス :param col_type:csvのヘッダに記載のデータを取得するための文字列 col_type = 'PV', 'user', 'Google impression', 'Total article', 'Average article rank' """ df = pd.read_csv(filename, encoding='SHIFT-JIS') # col_typeで整形するデータ列をスイッチ if col_type == 'PV': interest = df['PV数[PV]'] elif col_type == 'user': interest = df['ユーザー[人]'] elif col_type == 'Google impression': interest = df['合計表示回数'] elif col_type == 'Total article': interest = df['総記事数'] elif col_type == 'Average article rank': interest = df['平均掲載順位'] # 何年間分+何ヶ月分のデータがあるかを計算 len_full_year = len(interest) // 12 len_surplus_mont = len(interest) % 12 # 1年間揃っているデータをappend(1年に満たないデータはループが回らない) data = [] for i in range(len_full_year): years = np.zeros(12) years[0:12] = interest[i*12:(i*12)+12] data.append(years) # 余り月のデータ if len_surplus_mont != 0: months = np.zeros(12) months[0:len_surplus_mont] = interest[-len_surplus_mont::] data.append(months) print(type(data[0])) return data def plot(data: list, col_type: str): """ データを受け取りmatplotlibで可視化する関数 4月から翌年3月までを1行とし、1年毎にappendされたdataを matplotlibのplotで可視化する。 様々なデータ種類に対応するよう縦軸labelはcol_typeで指定する。 データの最大値をannotateで示す。 :param data:1年毎にグループ化された点列データ :param col_type:プロットの縦軸に使用する文字列 """ # ラベルを準備 label_ini = 2018 labels = [] for i in range(len(data)): label_ini += 1 label_str = 'FY' + str(label_ini) labels.append(label_str) # フォントのサイズと種類を設定する plt.rcParams['font.size'] = 14 plt.rcParams['font.family'] = 'Times New Roman' # 目盛を内側にする plt.rcParams['xtick.direction'] = 'in' plt.rcParams['ytick.direction'] = 'in' # figを生成し、全体のサイズとsubplot配置を設定 fig = plt.figure(figsize=(8, 3)) ax1 = fig.add_subplot(111) # 上下左右軸に目盛線を付ける ax1.yaxis.set_ticks_position('both') ax1.xaxis.set_ticks_position('both') # 横軸の設定:月にする axis_h = ['4', '5', '6', '7', '8', '9', '10', '11', '12', '1', '2', '3'] ax1.set_xlabel('Month') # 縦軸の設定:最大値を切りの良い数値にする ax1.set_ylabel(col_type) val_max = np.max(data) val_max_int = str(int(val_max)) val_min = np.min(data) val_min_int = str(int(val_min)) digits = len(val_max_int) axis_v_max = (int(val_max_int[0]) + 1) * 10 ** (digits - 1) axis_v_min = (int(val_min_int[0]) + 1) * 10 ** (digits - 1) ticks_v = 10 ** (digits - 1) ax1.set_yticks(np.arange(0, axis_v_max * 10, ticks_v)) ax1.set_ylim(0, axis_v_max) # プロットデータを用意 for i in range(len(data)): # 1年分のデータが揃っていない場合はデータを打ち切るために、有効な要素が何個かカウントする element = 0 j = 0 while element == 0 and j < len(data[i]): element = data[i][-(j+1)] j += 1 count = 12 - (j - 1) # 要素数で抽出してプロット ax1.plot(axis_h[0:count], data[i][0:count], label=labels[i], lw=1, marker="o") # annotation用 pos_max = np.argmax(data) pos_max_x = pos_max % 12 pos_min = np.argmin(data) pos_min_x = pos_min % 12 # 最大値を指す場合 ax1.annotate('Max=' + val_max_int, xy=(pos_max_x, val_max), xytext=(pos_max_x, axis_v_max + (axis_v_max//10)), arrowprops=dict(arrowstyle="->", color='blue'), fontsize=20, color='blue') ''' # 最小値を指す場合 ax1.annotate('Min=' + val_min_int, xy=(pos_min_x, val_min), xytext=(pos_min_x, axis_v_min + (axis_v_min//4)), arrowprops=dict(arrowstyle="->", color='blue'), fontsize=20, color='blue') ''' # 凡例をプロット領域外へ設定 ax1.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0, fontsize=14) # プロットを表示 fig.tight_layout() plt.show() plt.close() return if __name__ == '__main__': # csvからデータを取得(年間のプロットが書けるように整形) # col_type = 'PV', 'user', 'Google impression', 'Total article', 'Average article rank' col_type = 'PV' data = blog_report('blog_report.csv', col_type) # プロット plot(data, col_type) |
ちなみに上記コードは本職がPythonプログラマの方々にアドバイスを頂いて「DocString」という説明文を追加してみました。またTypeHintを関数の引数部分に記載することで、可読性の向上を狙いました。
うまく書けているかはまだわかりませんが、ブログやSNS、勉強会等の活動を通してアドバイスをして頂けるのは、個人だけでは気付かない点も学べるので助かります。
コーディングに関する勉強もしないとですね(これ以外にもPEP8とか?)。
まとめ
Python技術ブログの立ち上げから丸3年が経過したので振り返りをしてみました。PV数等の右肩上がり感はなくなってしまいましたが、蓄積されていく記事はFF10のスフィア盤を埋めるようで(伝わる?)楽しいです。
書きたいことを書き殴った形ですが、これで心気一転次の1年の活動ができそうです。
技術ブログは意外にもやってみると楽しいので、書きたいものがある方は是非自分のブログを作ってみることをオススメします。
是非今後とも当WATLABブログをよろしくお願い致します。
3年というと一区切りのような気がしますが、まだまだ記事を書いていく予定です!
Twitterでも関連情報をつぶやいているので、wat(@watlablog)のフォローお待ちしています!