今年の抱負的な何か
いつか更新しようと思ってたら一ヶ月たってしまった。。。
今更感ありますが、今年の豊富を書いとこうと思います。
毎週ブログを更新する!
8月から書き始めたはいいけど月一になってしまいましたね。自分がやったことを定期的にまとめると、記憶の整理にもなるし理解があやふやなところの発見にも繋がるのでちゃんと書いてこうと思います。去年はインフラの運用がメインの仕事だったりして中々かけることがなかったりしたのですが、上司に半ば無理やり取り行って運用改善のためのRailsアプリ作り始めたりしたので今年はもう少しかけることが増えるかな。twitterではちょっと書きましたがd3.jsをラップして使うjsライブラリを仕事で使ったので、紹介したいと思います。
履歴書にかける仕事をする
転職活動してて思ったのですが、自分って「これ自分がやりました!」と胸張って言える仕事があんまりないんですよね。プロジェクトの中で細かい改善とか、ツール導入とかは結構あるんですけど。上に書いたこととも被りますが、いまやってる運用改善のためのRailsアプリを1つまとめたいな。
何か1つWEBサービス作る!
去年はnode.jsを使ったRedmine用のクライアントアプリを公開したりして、そこそこ見てもらえたりしました。
Redmineクライアントのバグを色々と直しました。 - suzan2号の戯れ
が、やっぱりWEBサービス作ってみた!というのやっぱり凄く羨ましい。得られるレスポンスも違うし。友人とも色々やりたいねーという話はしてるので、今年中に何か作って公開したいなと思います。
Redmineクライアントのバグを色々と直しました。
会社のPCにDLしてみたはいいものの、色々とバグが多かったので…
あと地味にトラッカーをちゃんとプロジェクト毎のもの持ってくるようにしました。
自作RedmineクライアントのWindows版の配布を始めました
自作Redmineクライアント(RedNodeKit)のWindows版の配布を始めました。
Release add updating tickets function · suzan2go/RedNodeKit · GitHub
Window版はRedNodeKit-0.2-Win.zipです。
使い方はDLしたZIPファイルを解答して、中のRedNodeKit.exeをダブルクリック。
SettingタブでredmineサーバのURLとAPIキーを入力すれば使えます。
READMEにはWindows8.1をサポートと書きましたが、
自宅に8.1しかなくて試していないだけで多分Windows7やWindows8でも動きます。
このRedmineクライアントについての機能や使い方の詳細は以下の記事でご確認ください。
Redmineのデスクトップクライアント的なものをnode-webkitで作った - suzan2号の戯れ
Redmineのデスクトップクライアント的なものをnode-webkitで作った② - suzan2号の戯れ
自分で名づけておいて何だけどRedNodeKitと呼ぶのが段々と恥ずかしくなってきた感ある
中身がゴチャゴチャだったりチケット一覧表示がダサかったり色々と直したいけど、
そろそろ別のもの(WEBサービスとかスマホアプリとか)に挑戦したくなってきた。
そういえば前の転職記事に書き忘れたんだけど、面接の時に聞いた話だとWEB系企業ではAndroidエンジニアが足りてないらしいです。だからというわけじゃないけど、本棚の肥やしとなりつつあるAndroid本があったりするので、次はAndroidアプリに挑戦してみようかなー。
Redmineのデスクトップクライアント的なものをnode-webkitで作った②
前回の記事はこちら
Redmineのデスクトップクライアント的なものをnode-webkitで作った - suzan2号の戯れ
なんか凄い時間が立ってしまいましたが、チケットを表示・修正する機能をつけました。
suzan2go/RedNodeKit · GitHub
My Ticketsのタブから、現在自分に割り当てられているチケットの表示・更新ができます。
スマホアプリのように下にフックすることで更新もできます。
これにはhook.jsを使わせてもらいました。
本当にすごーく簡単にhookでの更新ができるようになりました。
jordansinger/Hook.js · GitHub
チケット一覧の画面でチケットをクリックすると、詳細な情報を表示できます。
更新履歴も出してますが、ステータスやメンバーの変更はidで表示されちゃいます。今後なんとかします。
以下、編集画面です。メンバーの変更とか、期日の変更とかステータスの変更など簡単な変更をここにすることを想定してます。注記に変更時のコメントを書く感じです。
更新したところ
前回の記事のあと今まで自分しか見てなかったんじゃね??というこのブログに200人以上が来てくれたりして、よっしゃー頑張るぞ!!となってたんだけど、仕事のピークも重なってしまい1ヶ月弱立ってしまいました。この3連休と先週末頑張ってやっと使って貰えそうなもんができました。
- できるようになったこと
- 自分が担当者のチケットをtwitterアプリ風(今は更新するとこだけだけど…)に表示する。
- チケットを編集する
- まだ出来ないこと
- 自分が担当者のチケットが作成されたら通知する(でもコレは結構しんどい)。
- 更新履歴の内容をちゃんと表示する(現在はメンバー変更も1とか2とかidで表示されてしまう)
ハマった点
- ajaxのPUTメソッドが、成功してるはずなのにerror処理に入ってしまう。
- バグではないみたいですが以下と同じ状況みたい?結局HTTPのステータスコードで処理を分けるようにしました。http://bugs.jquery.com/ticket/13350
あとはどこにはまったというより、自分のアプリ設計的なスキルの無さからくるものなんですが、ここもう少しうまく書けないかなぁーと色々と書きなおして結局スパゲチーに書いていたら時間がかなりかかっちゃいました。
rest.jsにチケットの取得・登録のrestをまとめてるんですが、いちいちajaxを毎回書いたりするし、restでデータ登録するとこはまとめてても、結局個別にhtmlのscript要素に似たようなコード沢山書いてしまったり。一回一からリファクタリングしたいと思ってます。javascriptのデザインパターン的なものを勉強したい。
Redmineのデスクトップクライアント的なものをnode-webkitで作った
何故作ったか
この前、社内でnode-webkitを使った社内SNSのクライアントソフト(twitterのクライアントアプリ的なもの)を作ってる人を見かけ、自分もnode-webkit(初めて知った)を使って何か作ってみたくなりやっちゃいました。
作成したのはredmineをデスクトップアプリケーションから弄るツールです。名づけてRedNodeKit(redmine + node-webkit)。node-webkitとbootstrapで作りました。node.jsの機能なんて使わんかなーと思ってましたが、ファイル入出力とか簡単にできて結構便利ですね。
- できたこと
- rednodeからチケットを登録する
- プロジェクトや担当者、トラッカーはredmineから自動で取得する
- できなかったこと
- 自分が担当者のチケットをtwitter風に表示する。
- 自分が担当者のチケットが作成されたら通知する。
- チケットを編集する
チケット登録しか出来ねえじゃねえか!という感じですが、忙しい上司などredmineをブラウザで開くことさえしてくれない方に気軽にチケット登録してもらうには良いのかなと。評判が良かったら機能を拡充させていきますので何卒…
ハマった点
箇条書きですが、ハマったところ。
- node-webkitだとhtmlのjavascript要素とnode.jsのjavascriptが混ぜ混ぜに書けちゃうので、どっちも素人の自分からするとWEB上のサンプルコード見てもこれどっちなんだろう…となる。
- node.jsからファイルを呼び出す/書き出す場合と、javascriptから読み出す場合でパスが違う場合がある。例えばファイルを読み込むときはjsファイルからの相対パスなのに、書き出すときにはnode-webkitを実行したところからのパスになるとか。(同じファイルに対して読み込むときと、書きだすときでパスが違う。きちんと試したわけではないので要検証)
- ctrl + c 、ctrl + vとか基本的な機能が使えない!調べても出てこない!自分で実装しなければいけないの?となった。Macの場合はウインドウの一番上に出てくるネイティブメニューバーを表示させる設定にしないと、アプリ共通のctrl + zとかが使えないみたい(デフォルトは非表示)。
node.jsそのものよりもbootstrapでこれどーやればいいんだー!とか動かねー!となっていた時間の方が長かった気がする。
githubについて
今まで登録だけしてたんですが、初めて自分の作ったものを上げてみました。何か凄くドキドキしてますわ。初めてニコ動に動画を上げたときみたいな感じ。少しでも何か反応があると嬉しいなーと期待してます。色々上げてみようっと。
redmineで進捗率をステータスに連動させた場合でも、親チケットのステータスは小チケットの進捗率に連動させる方法
いま自分のグループのredmineの管理者をやっているのですが、進捗率ってみんな変えてくれないですよね。入れてくれても人によって進捗率の考え方がバラバラだったり。そこでチケットのステータスに応じて(対応中とかフィードバックとか)進捗率を自動で変えられるプラグインとかないかなーと思っていたのですが、実はプラグインではなくデフォルトの機能で実現できます(自分は1時間くらいプラグインがないかググっていました…)。以下は少し古い記事ですが、redmine2.5でも同様の設定が可能です。
小技(0.9): チケットのステータスで進捗率を更新する | Redmine.JP Blog
チケットの進捗率をステータスに連動させた場合の弊害
ただし進捗率をステータス連動にさせた場合は、通常小チケット全体の進捗率に連動して自動で計算される親チケットの進捗率も、親チケット自体のステータスに連動して設定されてしまいます。以下の小チケットを4つ持つチケットで考えてみましょう。
チケット >小チケット1:進捗率100% >小チケット2:進捗率100% >小チケット3:進捗率100% >小チケット4:進捗率0%
この場合の親チケットの進捗率は以下の様になります。
チケットの進捗率がステータス連動でない ⇛ 75%
チケットの進捗率がステータス連動 ⇛ 小チケットの進捗率に関わらず、親チケットのステータスによって決まる。
自分のとこのredmineもそうなのですが、小チケットを多用してプロジェクトの管理をしている場合、親チケットの進捗率は小チケットの進捗率と連動してた方が見栄えが良いですよね。親チケットのトラッカーを分ける(このトラッカーにはステータスに応じた進捗率を設定しない)ことで、親チケットの進捗率だけ小チケット連動にすることもできますが、自分はもっとシンプルに実現したかったのでredmineのソースを弄ってみることにしました。
2014年10月19日 ソースが会社のサーバの中なので、続きは別途書きます。
2014年11月1日 追記(大分遅くなってしまった…)
細かく書こうと思ったけどだるいのでdiffを貼り付けます。
変更したのは${redmine_home}/app/model/issue.rbの中身変更。
進捗率(=done_ratio)に関する部分の処理条件に、「小チケットを持たないこと」を追加しました。
(children?で小チケットを持つか否か判別できる。
http://www.rubydoc.info/github/edavis10/redmine/Issue
)
今のところ特に不具合などは出てないですが、変更するなら自己責任で。
本当はこういうのもプラグインで実現するべきなんだろうか?
というかプラグインでこういう中身の処理までいじれるのかしら?
@@ -547,7 +552,7 @@ private :workflow_rule_by_attribute def done_ratio - if Issue.use_status_for_done_ratio? && status && status.default_done_ratio + if Issue.use_status_for_done_ratio? && status && status.default_done_ratio && !self.children? status.default_done_ratio else read_attribute(:done_ratio) @@ -629,7 +634,7 @@ # Set the done_ratio using the status if that setting is set. This will keep the done_ratios # even if the user turns off the setting later def update_done_ratio_from_issue_status - if Issue.use_status_for_done_ratio? && status && status.default_done_ratio + if Issue.use_status_for_done_ratio? && status && status.default_done_ratio && !self.children? self.done_ratio = status.default_done_ratio end end @@ -1352,7 +1357,7 @@ end # done ratio = weighted average ratio of leaves - unless Issue.use_status_for_done_ratio? && p.status && p.status.default_done_ratio + unless Issue.use_status_for_done_ratio? && p.status && p.status.default_done_ratio && !p.children? leaves_count = p.leaves.count if leaves_count > 0 average = p.leaves.where("estimated_hours > 0").average(:estimated_hours).to_f
PowershellのInvoke-RestMethodをhttpsに実施すると失敗する
PowershellのInvoke-RestMethodでhtppsのuriにRESTしようとしたらはまったのでメモ。Invoke-RestMethod自体はかなり便利でちょっと感動したので、前半はその紹介です。
Invoke-RestMethod
Powershell3.0からInvoke-RestMethodが追加され、WindowsからもLinux系でいうCurlのようなことができるようになりました。最近PowershellでInvoke-RestMethodを使ったスクリプトを書いたのですが、json形式のデータをRESTで取得してゴニョゴニョするのはLinuxからCurlよりもはるかに簡単だと思います。
例えば、RESTで以下のようなjson形式のデータを取得する場合は、
{"name":"John","age":"25"}
こんな感じで書くことができます。
>$var = Invoke-RestMethod -Uri http://xxxxxx/api/userlist -Method Get >echo $var.name John
jsonのデータはPowershell側で勝手にパースしてくれます。Linuxからbashでやろうと思うとcurlでとってきたものをawkして…とかやらないとだめですが、Powershellなら不要です。
httpsのURLにInvoke-RestMethodをする場合の注意点
自分はこれで結構はまってしまいました。問題の切り分けができなくて半日くらいかかったと思います…
具体的にはInvoke-RestMethodのuriがhttpsで、かつ相手のSSLサーバ証明書が自己証明書の場合には以下のようなエラーが起こります。私の場合は内部の管理サーバ(自己証明書)に向けてInvoke-RestMethodしてたのでエラーになりました。
Invoke-RestMethod : The underlying connection was closed: An unexpected error occurred on a send. At line:8 char:11
ググってみると以下のようにすればOK!と結構いろいろなところに書いてありますが、これだけではダメでした。
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}
実際にこの状態で実行すると以下のようにエラーの表示が変わるだけ。
Invoke-WebRequest : The underlying connection was closed: An unexpected error occurred on a send.
さらにググるとこんなページが!この人、自分とまったく同じ状況やんけ!
.net - Powershell v3 Invoke-WebRequest HTTPS error - Stack Overflow
結局、解としては以下のようです。
add-type @" using System.Net; using System.Security.Cryptography.X509Certificates; public class TrustAllCertsPolicy : ICertificatePolicy { public bool CheckValidationResult( ServicePoint srvPoint, X509Certificate certificate, WebRequest request, int certificateProblem) { return true; } } "@ [System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy
httpsの場合にはSSLサーバ証明書のチェックをしていて自己証明書の場合は弾くのがデフォルトのようです。
上のコードではCertificatePolicyの「CheckValidationResult」メソッドを上書きして無条件にTrueを返すようにしている…といった感じでしょうか。上記をスクリプトに追加したところhttpsでも問題なく動作するようになりました。