はてなブログからWordPressに移行しました
移行元のサイト
もっと自分のブログをカスタマイズしたくなったので先週あたりから始めてやって現在やっと
そこそこ整備出来てきたところです。
今現在出来ているのは
- はてなブログのデータをWordPressにインポート
- 独自ドメインで運用
- サイト全体をHTTPS化
- markdownを書いたりアクセス解析をするためのプラグイン導入
- Google Analyticsの設定
- サイトのテーマを変更
といったところ。
ここまであるのに平日の空き時間をちょっとずつ使って1週間くらい。
長かったけども1からサイトを構築してきたので勉強になった。
このサイトを立ち上げるまでにちょっと遠回りしたりもして、躓いたので
そのことについてちょっと書いてみようと思います。
最初はHeroku + WordPressで構築するつもりだった
Herokuはhobby-devなら月額7$で運用でき、独自ドメインが無料で使える。
なにより設定することが少なく楽。
また、hobby-devプランからSSL証明書の利用が無料になるというニュースも聞いていたので、
もうHerokuしかないと思っていた。
↓がそのニュース記事
https://getpocket.com/a/read/1707614130
Herokuアカウントはすでに持っていたので、Heroku + WordPressの導入自体は簡単だった。
以下の公式のREADME.mdを見ながらやれば途中まではできる。
https://github.com/mhoofman/wordpress-heroku
ただwp-config.phpにHerokuのDBの情報を設定する処理がないのでこのままだと立ち上がらない。
その点だけ気をつければ問題なくWordPressの起動はできる。
自分が躓いたのはこの後で、何か設定しようとするとWordPressが壊れてしまう。
例えば、
壊れてしまったら仕方ないのでGitを使ってHerokuにファイルをデプロイし直すのだが、
それをやる度に最初からやり直しになる。(これで結構時間食った…)
よく見たらバージョン古すぎ…。Githubのソースも2年ほど更新がされていなかった😲
更新がされていないことにもっと早く気付ければorz
まぁやってしまったものは仕方ない😅
なのでこれだとまともにブログを運用できないので環境を見直し。
色々調べた結果、さくらVPSを使うと良さそうな気がした。
さくらVPS上にWordPress環境を構築
結局ブログサイトはさくらVPS上に構築することにした。
OSはCentOS7で運用していて、nginx + PHP + MySQLで構築しています。
ちなみにさくらのプランは1Gバイト、2コアのプランです。
さくらVPSではインストールするOSを選べてその中にWordPress環境に特化したKUSANAGI
というのがあったのだけれど、できれば1から自前で構築したかったので、
あえてCentOS7を選択しました。
おかげでnginxやSSL証明書周りを詳しく学べました😄
ちなみに環境構築は以下のサイトが参考になります。
https://runble1.com/centos7-wordpress-kusanagi/
よく分からないところはちょくちょく公式のドキュメントを見たりしてれば構築できました。
構築してみた感想ですが、とにかく動作が早くて素晴らしい!!👏
WordPressも最新のバージョンを使っているので、壊れるということもないですね。
また、さくらVPSにすることでHerokuでできなかったことがいくつかできるようになりました。
おかげで自由にブログをカスタマイズしたりできそうです。
これだけできて月額1000円くらいなのでさくらVPS契約して良かったです。
今後やりたいこと
基本はてなブログの時のように書きたいことを書いていきます。
ブログのカスタマイズについては今後も記事を書いていくかも。
あと余裕があったらアフィリエイトとかにも手を出してみたい。
その前にまず人に読まれるブログにしないといけませんが😣
まとめ
ブログを効率良く運用するにあたってさくらVPS + WordPressはコスパ的に優れた選択だと思います。
サイト立ち上げもすでに出来ている環境を利用するのではなく、1から環境を構築していったので、
サービスを立ち上げるのに必要な知識も身につけられました😄
ということで個人的にはさくらVPSでWordPress立てるのおすすめ!使っていてとても気持ちいい😄
Heroku + WordPressはおすすめしません😓
今後はどんどんブログ更新していきますー!
それではよい1日を〜
Nintendo Switch買った!
昨日地元にあるケーズデンキに置いてあったので購入。やったぜ! やはり田舎なのか人がいないせいか普通に置いてありましたね。 新宿や渋谷を探し回っても見つからなかったのでホントに見つかった良かったです。
任天堂ハードって毎回出す度にデザインとか操作性で色々言われることが多い印象なんですが、
今回このSwitchを触ってみた感想としては結構いいんじゃないかと思います。
Switchの立ち位置としてはWiiUの後継機ということになるんでしょうが、実物は据え置き機というよりかは
サイズが大きい携帯機といった感じ。大画面でプレイしたければディスプレイに繋げればいいし、外でさくっと
やりたければ携帯機として遊べる。
個人的には場所を選ばずスキマ時間で遊びやすくなっていると思うのですごく好印象。
また、コントローラー部分を付け外しできるし、すごく軽いので扱いやすい。
操作性についてはまだあまりプレイしていないのでなんとも言えませんが、悪くはない気はしています。
夏に出るスプラトゥーン2とかは問題なくプレイできそうです。
ちなみにソフトはゼルダを買いました。
ゼルダは風のタクト以来プレイしていないし、今作は評判がものすごくいいので楽しみです。
プレイ後の感想とかもブログに書くかも。
Nintendo Switch Joy-Con (L) ネオンブルー/ (R) ネオンレッド
- 出版社/メーカー: 任天堂
- 発売日: 2017/03/03
- メディア: Video Game
- この商品を含むブログ (16件) を見る
- 出版社/メーカー: 任天堂
- 発売日: 2017/03/03
- メディア: Video Game
- この商品を含むブログ (12件) を見る
nodebrewを使ってNode.jsをインストール
仕事でnodeを使っているので勉強がてら触ってみる。
まずは環境構築から
開発環境
- ツールのバージョン
Homebrew 1.1.11
nodebrewのインストール
nodeのバージョンを管理したいのでnodebrewを使ってnodeをインストールすることにする。
まずはnodebrewをbrewを使ってインストール
$ brew install nodebrew $ nodebrew -v nodebrew 0.9.6
nodeのインストール
前述した通り、nodebrewを使ってnodeをインストール
$ nodebrew install-binary stable
上記のコマンドで最新の安定版がインストールできるはずだが、Failed to create the file
というようなエラーが出てインストールに失敗する(エラーログは取り忘れた)
これはインストールするためのディレクトリがないために発生している。なので、まずはインストールするためのディレクトリを作成する。
$ mkdir ~/.nodebrew $ mkdir ~/.nodebrew/src
ディレクトリを作成した後にもう一度インストールを実行すると問題なくnodeがインストールされる
nodeが使えるように設定
インストールしたnodeを実行できるようにnodebrewからnodeのバージョンを選択する
$ nodebrew use stable $ nodebrew ls v7.7.3 current: v7.7.3
また、nodeにPATHを通すために以下のように.bash_profileにPATHを追加
$ echo 'export PATH=$PATH:/Users/xxxx/.nodebrew/current/bin' >> ~/.bash_profile
ターミナルを再起動してからnodeを実行
$ node > console.log('Hello Node.js!') Hello Node.js!
環境構築おわり。
作業の工数を見積もるときの3つのポイント
自分は今年で3年目のエンジニアになるが、未だに作業工数の見積もりは難しく思う。
今までいくつかのプロジェクトにアサインされてきた。その中で、自分はPGとしてコーディングをしたり、
SEとして設計書作成をしていたが、共通しているのはそのタスクには期限があるということ。
そしてその期限をもって、プロジェクトの全タスクはスケジューリングされている。
タスクには期限を設ける必要があるため、そのタスクについていくつか考えなければならないことがあるだろう。
「そのタスクの成果物は?」
「そのタスクの完了にはどのくらい時間がかかるの?」
「そのタスクはいつ終わる?」
将来の結果を予測するのは難しい。だが見積もりは重要だ。
なぜならいつ終わるのか分からなければ、次のタスクをいつ振ればいいのか決めようがないから。
つい先日、プロジェクト内のPMに見積もりについていい事を聞けたので、ここでまとめてみる。 見積もりのポイントは次の3つ
- タスクは細かく分割する
- 工数はフィボナッチ数列を使って見積もる
- 工数が分かるタスクで相対的に測る
1つずつ章ごとに分けてまとめてみる
タスクは細かく分割する
タスクの見積もりは難しい。それが大きなタスクであればなおさらだ。 タスクは細かく分けるほど正確な工数を見積もれるのだから、タスクを分けるのは重要なことだ。
個人的にはタスクは最大でも3日で終わるような規模にするべきだと考えている。
でないと自分の今持っているタスクを十分に見える化することができない。
例えば「実装」というタスクを振られたとして、その作業をどのように分けるべきか。
実装といってもコーディングして終わり、ではないだろう。コーディングが終わったら動作確認をしたり、
バグがあればまたコーディングに戻り、動作確認が終わればリポジトリにコミットして次はソースレビュー。
レビューで指摘を受けてまたコードを修正、動作確認、…という流れになるはず。
なのでタスクを分割すると以下のような感じ。
- コーディング
- ソースチェック
- 動作確認
- リポジトリにコミット
- ソースレビュー
- レビュー指摘箇所の修正
- 修正後の動作確認
- 修正後のソースコミット
- 修正後のソースレビュー
このように作業に分割すれば見積もりはしやすくなるだろう。
また、ソースレビューは自分の作業だけでは完結せず、レビューが行われるまでは待ちの状態になる。
その点も考慮してスケジュールを組まないと余裕を持って期限内に終わらない可能性が出てしまう。
タスクが十分に分割されていれば、正確に見積もりができ予定通りに作業を完了させられるように
なるのではないだろうか。
工数はフィボナッチ数列を使って見積もる
フィボナッチ数列とは1,1,2,3,5,〜と続く数列で、ある値はその前とその前の前の数を足し合わせた値になる。 フィボナッチ数列に登場する値を使うと相手に工数が伝わりやすくなるとのこと。 例えば
1人日:すぐに終わりそう
3人日:そこそこ時間かかるね
5人日:結構かかるな〜
8人日:え!かかりすぎじゃない!?
13人日:何かがおかしい
ポイントとしては5人日以上かかる想定であれば、そのタスクの見積もりは妥当ではないということ。
前の章でも述べたが、タスクは小さく区切るべきであり5人日かかるタスクというのはそもそもタスクの分割が
不十分である。従ってそのようなタスクがあれば、またタスクを分ける作業に戻るべきだろう。
また、1人日、3人日、5人日というような見積もりだけだとかなりざっくりしているが、さくっと相手に
作業時間を伝えることができる。
自分は見積もりに結構時間を使ってしまうタイプなので、この方法を活用して楽出来ればなーとか考えてます。
工数が分かるタスクで相対的に測る
あるタスクの作業量を伝える時、単純に何人日かかると言っても伝わりにくい場合は、
すでにある実績と比較して伝えるとわかりやすいらしい。
例えば、
「以前こういう作業にこれぐらい時間がかかり、今回の作業は誰々さんが実施するので〜倍の何時間かかります」
というような感じ。
この方法なら割と簡単に時間をかけずに工数を見積もれる気がしますね。
自分は実績をものさしにして見積もりをするということはしなかったですが、今後は実績はちゃんと計測して 将来の見積もりに役立てるようにしたいなー。
まとめ
ポイントとしては以下の通り。
1.細かくタスクを分ける
2.フィボナッチ数列でざっくり見積もる
3.タスクは他の作業と比べて相対的に測る
今回はPMとの飲み会でいい話が聞けたので、まとめてみた。
これらのポイントを抑えれば見積もりもきっと上手くなると思うので、これからはちょっと意識してみます。
Android4.3以前の標準ブラウザはplacefolderをサポートしていない
placeholderのcssをどうやって古いAndroidのブラウザにも対応させようかで詰まってたけど、 そもそも対応してなかったというオチ
http://caniuse.com/#search=placeholder
リンク先の通り、Android4.3以前のバージョンはplaceholderをサポートしていない。 もっと早くにこの線で調査すればよかったorz
caniuse便利だね
継続的インテグレーションによって何が出来るようになるか考えてみる
継続的インテグレーション(CI)について、軽くググってみたら色々出てきた。
継続的インテグレーションとは?– アマゾン ウェブ サービス
なんでこんなこと調べていたかというと、社内のプロジェクトでCIについて議論する機会があったが、 この辺のノウハウには疎かったのであまり話についていけず気になっていたから。
今現在所属しているプロジェクトは、短いスパンでサービスをリリースしてはそれと並行して開発進めている、いわゆるアジャイル開発だ。
また、開発自体は外部に委託していて、うちの会社はコードの品質管理などをしている。
そんなプロジェクトだが、歴史自体は浅くCIツール(Jenkins)などは導入されていない。
あるとすればコードの品質を最低限保つためのSonarQubeがあるだけ。
それとソースはGitで管理しているが、なぜかリポジトリはBacklogで管理されている。
また、ブランチ管理はGit FlowとかGithub Flowとかではない。masterとリリース+開発用のブランチがあるだけ。
こんな感じのプロジェクトだが、プロジェクトの現状についてどう改善していくか議論する機会をもらえたので、 せっかくなのでCIツールとは何か、CIってなにするのか、問題点とか将来こうしたいなど自分の考えとか理想とかをまとめてみる。
CIについて
CIについては上のAmazonのページがよくまとまっている。
CIの目的はつまりこのような感じだろう。
- 開発者の生産性向上
- コードの品質向上
- リリースと結果確認にかかる時間の短縮
上記3つを目標とする際、実際にするべきことはなんだろうか。それぞれ必要なことを軽く挙げてみる。
開発者の生産性向上
- 重要なコーディングに集中する
- 開発中に埋め込まれるバグを減らす
- バグを早期発見する仕組みを作る
コードの品質向上
リリースと結果確認にかかる時間の短縮
- リリーススクリプトを用意して、リリース作業を自動化する
- ビルド、リリース結果を担当者に通知する
- ビルドからリリース結果確認までの手順を簡略化する
CIツール等を使えば上記のようなことはできそう。
他にもできることはありそうだが、とりあえずは上の項目をプロジェクトに盛り込みたい。
現プロジェクトの問題点
今プロジェクトが問題にしていることはだいたい以下の通りである。
- CIツールがないため、自動ビルドや自動デプロイというような仕組みがなく、その作業に時間を使っている
- 品質向上の為、SonarQubeを使ってはいるが、手動で行っていて時間がかかっている
- 開発フローにコードレビューが存在せず、局所的にコードレビューを行っているのみ
- リリースの手順が複雑、時間もかかる
現プロジェクトの問題点として、自動化できるような部分で時間を取られていたりしていて面倒くさい。
やはりエンジニアとして自動化出来る部分は自動化して、本質的な作業に集中したい。
また、ブランチ管理の規約を設け、開発用のブランチを用意することでブランチの構成をシンプルにした上で、 他のツールとの連携もしやすい環境にしたい。
そのためにもまずは、JenkinsなどのCIツールの導入や、ブランチ管理、開発フローの見直し等が必要なのかなと 考えている。
今後について
今のプロジェクトについて問題点を挙げたので、次はそれについて具体的な解決策などを模索していきたい。 まだまだ勉強不足で考慮が足りていない部分もあるだろうけども、今後メンバーとプロジェクト体制を見直していく上で 少しずつ知識を身に着けていければいいかなー。
まとめ
今回はCIとは何であって、プロジェクトの問題に焦点を当てながら理想の開発環境を書いてみた。
今後どうやってCIを導入していくかは気が向いたら書く。
今はもう疲れたから寝る。
【Swift3.0】Errorプロトコルを使った例外処理のサンプルを作ってみた
Swift3.0でErrorプロトコルとdo~catch構文、tryを使ってみた。 最小限のコードだけメモとして残しておく。
実行した環境は以下の通り
- xcode version:8.2.1
- swift version:3.0.2
Errorプロトコルを定義
以下の様にErrorプロトコルを定義する
enum TestError:Error { case Error1(String) case Error2(String) }
enum要素に引数をとることで、エラーメッセージなどを呼び出し元から参照することができる。
次に上記の例外を投げる関数が以下。
func TestMethod(str:String) throws { if str == "error1" { throw TestError.Error1("エラー発生1") } else if str == "error2" { throw TestError.Error2("エラー発生2") } }
また、例外をthrowするメソッドはthrows宣言をしないとコンパイルができない。
try~catch構文とtryで関数呼び出し
作成した例外を投げる関数をdo~catch構文の中で呼ぶ。
関数を呼び出すときは先頭にtryをつける。
Errorプロトコルの要素は引数にStringを取っているので、
例外発生時にその値を出力するようにしてみる。
do { try TestMethod(str: "error1") } catch TestError.Error1 (let err) { print (err) } catch TestError.Error2 (let err) { print (err) } //実行すると「エラー発生1」と出力される
まとめ
- Errorプロトコルを使うことで例外を定義できる
- 要素に引数を与えることで、例外発生時に呼び出し元にデータを渡せる
- 例外を投げる関数にはthrows宣言をつける
- 例外が発生しうる関数の呼び出しはdo~catch文の中で呼び出す