<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>はまじさんの新人えんじにあぶろぐ</title>
<link>https://ameblo.jp/hamaji-dev/</link>
<atom:link href="https://rssblog.ameba.jp/hamaji-dev/rss20.xml" rel="self" type="application/rss+xml" />
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com" />
<description>CAに入社したはまじさんによる、研修の感想や日々の業務について思うことを書く場所</description>
<language>ja</language>
<item>
<title>2014/12/03</title>
<description>
<![CDATA[ <br><iframe src="https://static.blog-video.jp/?v=Z3xrsiMF2z9mAQ5UmjrUG8XC" width="276" height="276" frameborder="0" scrolling="no"></iframe><br>
]]>
</description>
<link>https://ameblo.jp/hamaji-dev/entry-11960138474.html</link>
<pubDate>Wed, 03 Dec 2014 17:02:55 +0900</pubDate>
</item>
<item>
<title>1月のまとめ</title>
<description>
<![CDATA[ <p>年末に1年分の振り返りやってみたんですが，まとめるのがクソ面倒（＆記憶が吹っ飛んでる）ので，月次でまとめることにしました．<br>何ヶ月続くか不明ですが，とりあえず今月分を．</p><h2>やったこと</h2><h3>Apache ＆ Nginx</h3><span><dl><dt><a href="http://click.affiliate.ameba.jp/affiliate.do?affiliateId=26162484" alt0="BlogAffiliate" target="_blank" rel="nofollow">サーバ構築の実際がわかる Apache[実践]運用/管理 (Software Design p.../技術評論社<br><img src="https://img-proxy.blog-video.jp/images?url=http%3A%2F%2Fecx.images-amazon.com%2Fimages%2FI%2F51VkQjM187L._SL160_.jpg" border="0"></a></dt><dd style="margin: 0pt;">￥3,129</dd><dd style="margin: 0pt;">Amazon.co.jp</dd></dl></span><span><dl><dt><a href="http://click.affiliate.ameba.jp/affiliate.do?affiliateId=26162483" alt0="BlogAffiliate" target="_blank" rel="nofollow">ハイパフォーマンスHTTPサーバ Nginx入門/アスキー・メディアワークス<br><img src="https://img-proxy.blog-video.jp/images?url=http%3A%2F%2Fecx.images-amazon.com%2Fimages%2FI%2F51xpswg%252BkkL._SL160_.jpg" border="0"></a></dt><dd style="margin: 0pt;">￥3,150</dd><dd style="margin: 0pt;">Amazon.co.jp</dd></dl></span><span><dl><dt><a href="http://click.affiliate.ameba.jp/affiliate.do?affiliateId=26162482" alt0="BlogAffiliate" target="_blank" rel="nofollow">マスタリングNginx/オライリージャパン<br><img src="https://img-proxy.blog-video.jp/images?url=http%3A%2F%2Fecx.images-amazon.com%2Fimages%2FI%2F51br3R9ROmL._SL160_.jpg" border="0"></a></dt><dd style="margin: 0pt;">￥3,150</dd><dd style="margin: 0pt;">Amazon.co.jp</dd></dl></span><p><br>年末に宣言していたとおり，ApacheとNginxの本を購入．<br>さらっと読み流すものの，Nginxの理解はまるでできていません．</p><br><p>AWSのインスタンス立てて，マスタリングNginxの始めのページの方をちょろちょろっといじって，location, serverディレクティブの階層関係はとりあえず理解しました．</p><br><p>なにげに初AWSで，アクセスログ＆セキュリティログみるとおびただしい量のログ流れてて，マジ怖ぇーって体験をした感じです．<br>うかつにポート開けれなくて，はじめはRabbitMQとか建てようと思ってたんですが，AWSでやるの諦めました<br>（社内クラウドやVagrantで建てたVMにRabbitMQサーバ建ててます）</p><h3>Spring 4 &amp; Spring Boot</h3><p>1月に日本オラクル本社で開催された<a href="http://jjug.doorkeeper.jp/events/8113" style="color: rgb(148, 113, 222);">【東京】JJUG ナイトセミナ 「Spring Framework 特集」</a> に参加してきました．</p><br><p>最近のSpring関係で話題なのが，Spring 4のリリースで，なんと<strong>iBatisとStrutsのサポートを終了する</strong>という話を聞いてきました．<br>社内では Spring + Struts + ibatis というプロジェクトもちらほらあり，Spring 4移行は結構骨が折れそうなイメージを持ちました．</p><br><p>Spring的には「Hibernate使え」とのことなので，そういう流れになるといいなぁ・・・</p><br><p>もうひとつの目玉がSpring Bootで，これは自分的に結構気に入ってます．<br>というのも，<strong>ウェブアプリケーションをスタンドアローンで起動できる</strong>というヤバい機能を持っているところに惹かれました．</p><br><p>通常，JavaでWebアプリケーションプロジェクトを開発して動作確認するには，Eclipseを使い（すでにここでイケてない），Tomcatサーバを設定し，プロジェクトとサーバを紐付けて，サーバを起動する，という手順が必要です．<br>最近では，Intellijもボチボチ普及し始めてきてるのですが，上記のような手順は解消できず，「Intellijで開発」→「Eclipseを立ち上げてサーバ起動して動作確認」という，なんとも頭の悪い方法で開発せざるをえません（実際やった）</p><br><p>ところが，Spring Bootを使うとこの問題が解決されます．エントリーポイントのクラスを用意しておき，mainメソッドを実行するだけでデプロイ済みのTomcatサーバが立ち上がってしまいます！！！</p><br><pre class="brush: java;">@ComponentScan(basePackages = {"my.springboot.sample"})@EnableAutoConfiguration()public class Application {&nbsp; &nbsp; public static void main(String[] args) {&nbsp; &nbsp; &nbsp; &nbsp; SpringApplication.run(Application.class, args);&nbsp; &nbsp; }}</pre><br><p>これは非常に便利で，サーブレットコンテナ自体もバージョン管理システムで共有可能になる（Mavenの依存関係として保持）上，「このmainメソッド実行したらTomcatサーバ立ち上がるしー」とだけ言えばいいので，引き継ぎが楽になるという利点があります．</p><br><p>社内でSpring Boot広めていきたいのですが，残念ながらSpring BootはSpring 4以上にのみ対応しており，上記で述べたとおりiBatisが使われている以上，移行できないという問題に直面しています．<br>新規Springプロジェクトでは，ぜひともSpring Bootを採用してほしいです（切実）．</p><br><p>余談ですが，社内で数少ないiBatis &amp; Strutsを使っていないプロジェクトをブランチ切ってSpring Bootに適応させてみました．<br>ロギングプラグイン周りの依存関係やSpringのApplicationContextを読み込ませる辺りでかなり骨が折れましたが，一応動作するようになりました．</p><br><h3>AMQP and MQTT, with RabbitMQ</h3><p>最近のはてダでMQTTの話がボツボツ出始めたので，流行りに乗っかって勉強しました．</p><br><p>まーやっぱアレです．既に実装されたものがあるなら，使って体系的に覚えるほうが理解が進みますね．</p><br><p>今回本当にそう痛感した理由が，MQTTプロトコルでRabbitMQをBroker（メッセージ仲介役．キューとかを持ってる）としてメッセージパッシングやってみたとき，Brokerでどういう挙動をしているか観察したことによります．</p><br><p>デフォルトでAMQPをサポートしているRabbitMQでは，プラグインを利用することでMQTTプロトコルも利用できるようになります．<br>そのとき，RabbitMQでは，AMQPの仕組みを利用してMQTTプロトコルを処理するように実装されているため，見かけ上はMQTTプロトコルを捌くブローカーですが，内部ではAMPQを処理しています．<br>プラグインがうまいことやってくれてる感じですね．</p><br><p>そのため，MQTTプロトコルで通信したときの様子を<code>rabbitmqctl</code>コマンドで状態を確認したところ，AMQPの仕組みについて理解が深まりました．<br>なんとも不思議な順序ですが，AMQPの理解が進んでとても満足しています</p><br><p>半分ぐらいは理解したので，あとは疑問に思ったところを実際動作させて結果を見て仕組みを知る，という流れで理解を深めていきます．</p><br><p>ちなみに，この辺は日本語ドキュメントが非常に少ないので，実際AMQP/MQTTのクライアントのコード追ったほうが早いと思ってます．</p><h2>来月に向けて</h2><h3>プログラミング言語 Erlangの習得</h3><p>「RabbitMQでMQTT動作させてるときって内部ではAMQPとして動いてるのかなー」ってつぶやいたら，「RabbitMQのMQTTプラグインに書いてるやろ．読めや」みたいな感じでリプライ飛んできたので（大幅な誇張表現あり），Erlang製のRabbitMQの仕組みの理解を深めるためにも，Erlangの習得は不可欠だと感じました．</p><br><p>飛行機本を本日Amazonで購入したので，明日の月初から触り始めていきます．<br><span></span></p><dl><dt><a href="http://click.affiliate.ameba.jp/affiliate.do?affiliateId=26162481" alt0="BlogAffiliate" target="_blank" rel="nofollow">プログラミングErlang/オーム社<br><img src="https://img-proxy.blog-video.jp/images?url=http%3A%2F%2Fecx.images-amazon.com%2Fimages%2FI%2F51bZh24YhqL._SL160_.jpg" border="0"></a></dt><dd style="margin: 0pt;">￥4,620</dd><dd style="margin: 0pt;">Amazon.co.jp</dd></dl><p></p><br><p>目標は．「え？？？今どきLisp？？？ｗｗｗｗｗｗマジウケルｗｗｗｗｗｗ」とLisperの皆さんを煽るレベルにまで使いこなせるようになるところです．</p><h3>Serverspec &amp; Chef</h3><p>今月から，サーバの移設タスクがどっと来るので，いい機会なのでServerspecのテスト＆実行環境と，Chefのレシピをゼロから作ります．</p><br><p>Chefは社内でも実績多いですが，Serverspecはまだ1プロジェクト程度なので，これを気にどんどん広めていくつもりです．<br>NWの制約的に難しくなる可能性もあります（インフラチームのポリシー）が，Jenkinsからserverspecのテストを叩ける状態にまで持っていければ，おそらく万全でしょう．</p>
]]>
</description>
<link>https://ameblo.jp/hamaji-dev/entry-11761780490.html</link>
<pubDate>Fri, 31 Jan 2014 15:53:07 +0900</pubDate>
</item>
<item>
<title>2013年のまとめ</title>
<description>
<![CDATA[ <h1>2013年の総括</h1><p>お疲れ様です．はまじです． &nbsp;<br>今年の振り返りをやってみようと思います．</p><p>割りと，自分の忘備録的な感じに仕上がってしまったので，記事としては面白くないと思います・・・．</p><p>一気に書くと長いので，月次でまとめてみました．</p><h2>月次まとめ</h2><h3>1月</h3><ul><li>学生最後の年．修論に勤しむ</li><li><a href="http://www.tk-game-diary.net/geistesblitz/geistesblitz.html">おばけキャッチ</a> にハマる．</li></ul><h3>2月</h3><ul><li>修論提出＆公聴会</li><li>研究室からの朝帰りで，他に誰もいない家で父がエロいビデオ見てたのを目撃（人生初）</li><li>修論旅行で九州の別府 → 湯布院 → 福岡をへ．湯布美人の生酒がクソうまかった</li></ul><h3>3月</h3><ul><li>グランツーリスモ5 でイベント戦 鈴鹿1000km を攻略<ul><li>GTカーで1:58台をコンスタントに出せるようになった</li></ul></li><li>東京に引っ越し．会社のシェアハウスへ．</li></ul><h3>4月</h3><ul><li>入社．惰性で続けてしまうと思っていたオンラインゲームをビタッとやめる<ul><li>正直，自分でも驚いた．</li><li>結局 引退はしてなくて続けているんですが（12/30現在）</li></ul></li></ul><h3>5月</h3><ul><li>研修で使用していたコードレビューツールをメンテ（主にリファクタリング）</li><li>企画と開発を両方やるエンジニアになると意気込んでいたが，自分にあわないと気づいたので開発一本で頑張ろうと決心</li><li>このころに研修で書いてたユニットテストについて，後々同期から関心のお言葉をいただく（あれはむしろ煽りだったかも）．</li></ul><h3>6月</h3><ul><li>配属<ul><li>社内でも中核で重要なプロジェクト（の管理面）を担当することになった<ul><li>ユニットテストがほぼなく，自分の理想とする状態から結構離れててちょっと失望気味だった</li></ul></li></ul></li><li>PlayFramework（Java）とSpring Framekwork3を触り始める<ul><li>同期で勉強会開始．</li></ul></li><li>デザインパターンの重要性に気づき，ちょこっとずつ勉強を始める．</li><li>自分の身につけていた技術と会社で使用されている技術に大きく乖離していることに気づく<ul><li>所詮，Railsだのherokuだのっていうのは，あくまでスタートアップの話で，100万人単位のユーザにサービスを提供できる技術の情報は，Webで簡単に拾ってこれないと気付かされた．</li></ul></li></ul><h3>7月</h3><ul><li>インフラ研修．<ul><li>Ciscoのルータとか触れたのが非常にいい経験だった．</li><li>VMware Workstationがほしくなる</li></ul></li></ul><h3>8月</h3><ul><li>自分の担当サービスのリファクタリング案を考えてたりしてた</li><li>大学の後輩に銀座で寿司を奢る</li><li>Hotspot VM（Java VMの代表的なもののひとつ）について記事集めまくってた<ul><li>正直なところ，当時勉強していたことは身についてない．要再学習</li></ul></li></ul><h3>9月</h3><ul><li>新しく別のプロジェクトを担当することになったが，こちらもテストがほぼなかった．<ul><li>Springの使い方も慣れてきたので，プロジェクト内に始めてユニットテスト作成．</li><li>後日，先輩が自分のを参考にしてくれた</li></ul></li><li>serverspec というサーバの状態のテストを行うテストフレームワークを触り始める<ul><li><a href="https://github.com/serverspec/serverspec/pull/256">人生初Pull Request ＆ マージ</a></li><li>そのときのうれしさは文字に表せない．これを気にOSSへの貢献を続けたいと思った．</li></ul></li></ul><h3>10月</h3><ul><li><p>技術研修</p><ul><li>とりあえず講師がすごい．スーパーマン</li><li>ふだんなかなか構築する機会の少ないLDAPやHeartBeat，DRBDの構築を体験することができた</li></ul></li><li><p>serverspecにpull requestを送った箇所を，Qiitaに記事投稿しようとして色々調査した結果，自分の修正箇所が微妙なんじゃないかという疑念に駆られる</p></li><li>いろんなのサーバが混在していると有用なので，台数が多いプロジェクトでは有用なんだけど，当時は変な改良加えてしまったと思い込んで相当凹んでた．<ul><li>ちょうどこの時期にこのタイトルの記事を見つけてしまったので，更に凹む “<a href="http://memo.overknee.info/post/64423815085">誰がオープンソースソフトウェアを酷いものにしてしまうのか - 人生が二度あれば</a> &nbsp;”</li></ul></li><li>一応Qiitaにまとめてはいます．<a href="http://qiita.com/aibou/items/5e58a609eafa79dbc0a2">sudoコマンドのメッセージを変える方法 - Qiita [キータ]</a></li><li><a href="http://www48.atpages.jp/jinroksg/rule.htm">ワンナイト人狼</a> にハマる</li><li>鈴鹿でF1を楽しむ</li></ul><h3>11月</h3><ul><li>同期が必死こいて深夜遅くまで開発作業しているのに対し，自分の担当プロジェクトには案件が余り入ってこなくて（つまり暇で）危機感を覚える<ul><li>いま自分のいる場所が，経験を身につける場所としては不相応な場所だと察知．勉強会に参加しようと決意</li></ul></li><li>怖いScala に参加<ul><li>実はScala触り始めて3日目だったんですが，いい感じで意識改善できた気がする．</li></ul></li></ul><h3>12月</h3><ul><li>勉強会2回参加（第8回Jenkins勉強会，渋谷.rb[201312]）</li><li>Sensu というリソース死活監視ソフトウェアを触り始める<ul><li>ついでにSensuで使用されているRabbitMQとRedisについても学んだ</li><li>とくにRabbitMQは社内でも結構使用されているミドルウェアだったので，Sensuを介してAMQP（Advanced Message Queue Protocol）を勉強できたのは本当によかった．</li></ul></li><li>社内のとあるserverspecのプロジェクトで，自分が貢献したコードを利用していることを発見．<ul><li>この改変はあまり公にしていなかったので（もしかしたら開発者のmizzyさんが情報をまとめてくれたのかもしれませんが），まさか社内で使われるとは思ってなかった．</li><li>超絶嬉しかったです．自分の実装した機能がユーザに使われるよりも，自分よりも経験と実力のある技術者に認めてもらえたような気がして嬉しかったです．</li></ul></li><li>一時的に落ちてたserverspecへの熱意を取り戻して，自分の担当プロジェクトのserverspecを記述開始．<ul><li>Rakefileの使い方もここで勉強</li></ul></li></ul><h2>まとめ</h2><p>学生から社会人へパラダイム・シフトした年なんですが，社会人になってからの方が勉強しましたし，学んだことが多かったです．<br>採用面接時に即戦力と大口叩きまくってたので，もし過去にタイムスリップできるなら自分をぶん殴りたいです．</p><p>また，住居が東京になったことで，話題の勉強会に参加しやすくなりました．<br>11月以降からそれを有効活用し始めてますが，もっと早く動けばよかったと若干後悔しています．<br>今後どうなるかわかりませんが，とりあえず東京にいるうちに色んな勉強会に参加して，学ばせていただこうと思います．</p><h2>来年に向けて</h2><p>来年はミドルウェアをメインに勉強していくつもりです．<br>とりあえず上半期はApacheとnginxをはじめとして，軽量なもの（webrick）も含めたWebサーバ全般と，サーブレットコンテナ（＋APサーバ）も触っていこうと思ってます．</p><p>そのほか，現在勉強中のRabbitMQや，Nettyを使用して実現された非同期通信を提供する社内ライブラリの勉強といったところでしょうか．<br>（Nettyの非同期通信ライブラリは使いこなせるようになりたいと思ってます）</p><p>DB周りに関しては，いまのところ業務で触る機会がないので，DBメインの案件抱えたときに勉強し始めます．</p><p>あと，OSSへの貢献も活発にしていきたいです．</p><h2>最後に</h2><p>今年は様々な方にお世話になり，またご迷惑をお掛けしてしまいました．<br>お世話になった方には心からの感謝を，ご迷惑をお掛けした方には心からの謝罪を申し上げます．</p><p>未熟者ではありますが，来年以降も精進してまいりますので，ご指導ご鞭撻の方宜しくお願い致します．来年も宜しくお願い致します．</p>
]]>
</description>
<link>https://ameblo.jp/hamaji-dev/entry-11740388714.html</link>
<pubDate>Tue, 31 Dec 2013 20:41:30 +0900</pubDate>
</item>
<item>
<title>Strategy パターン</title>
<description>
<![CDATA[ <p>どうもはまじです． 今回はデザインパターンのStrategyパターンについてご紹介したいと思います．</p><h2>Strategyパターン</h2><p>例えば，じゃんけんのプログラムを書きました．<br>このUserクラスは，ずっとグーを出し続ける戦略を採っています．</p><pre class="brush:java;">enum Hand {&nbsp; &nbsp; BLOCK,&nbsp; &nbsp; SCISSORS,&nbsp; &nbsp; PAPER;}class User {&nbsp; &nbsp; private String name;&nbsp; &nbsp; private int wons;&nbsp; &nbsp; public Hand getHand() {&nbsp; &nbsp; &nbsp; &nbsp; return Hand.BLOCK;&nbsp; &nbsp; }}</pre><p>このクラスのインスタンスだけでじゃんけん大会すると．．．結果は悲惨なことにｗ<br>なので，<strong>別の戦略を持ったユーザクラスを作りたい．．． と思ってはいけません！</strong></p><p>※悪い例</p><pre class="brush:java;">class RandomHandUser extends User {&nbsp; &nbsp; private static Hand[] hands;&nbsp; &nbsp; static {&nbsp; &nbsp; &nbsp; &nbsp; hands = new Hand[]{ Hand.BLOCK, Hand.SCISSORS, Hand.PAPER };&nbsp; &nbsp; }&nbsp; &nbsp; @Override&nbsp; &nbsp; public Hand getHand() {&nbsp; &nbsp; &nbsp; &nbsp; return hands[(int)Math.random() * 3];&nbsp; &nbsp; }}</pre><p>さて，これで何が問題なのかJavaに詳しい人は一発でわかるでしょう．<br>そう，<strong>nameとwonsが名前解決できません</strong>．<br>何故なら，Userクラスで定義された上記フィールドはそれぞれprivateなため，子クラスに継承されません．</p><p>ならばprotectedにすればいい？いえいえ，それは設計の過ちです．<br>protectedはabstractクラスなど，ほぼ継承されることがわかっているときに使えばよく，Userクラスのような通常のデータはprivateであるべきです．</p><p>ではどうすればいいのでしょうか．</p><p>答えは，<strong>Userクラスの中に戦略フィールドを用意することです</strong>．</p><p>どういうことかというと，今までは<code>User#getHand</code>の中で実装していましたが，これを別のクラスに委譲してやればいいのです．</p><p>まずは，「<code>getHand()</code>を呼べば，何かしらのHand型が返ってくるメソッドが必要」であると考えられます．<br>Userクラスでも同じメソッド名で呼び出しますが，そうではなく「じゃんけんの戦略に対して<code>getHand</code>する」という考えを持ってみます．</p><p>そうすると，必然的に次のインターフェースが思い浮かぶことになります．</p><pre class="brush:java;">interface HandStrategy {&nbsp; &nbsp; public Hand getHand();}</pre><p>ではこの戦略を実装した，「グーしか出さない戦略クラス」を作りましょう．</p><pre class="brush:java;">class OnlyBlockHandStrategy implements HandStrategy {&nbsp; &nbsp; @Override&nbsp; &nbsp; public Hand getHand() {&nbsp; &nbsp; &nbsp; &nbsp; return Hand.BLOCK;&nbsp; &nbsp; }}</pre><p>という感じで，どんどん戦略クラスを作っていきます．<br>で，これらの戦略クラスをユーザが個別に持てるようにします．</p><pre class="brush:java;">class User {&nbsp; &nbsp; private String name;&nbsp; &nbsp; private int wons;&nbsp; &nbsp; private HandStrategy handStrategy;&nbsp; &nbsp; public Hand getHand() {&nbsp; &nbsp; &nbsp; &nbsp; return handStrategy.getHand();&nbsp; &nbsp; }}</pre><p>で，mainのコードはこうなりますね．</p><pre class="brush:java;">public static void main(String[] args) {&nbsp; &nbsp; User alice = new User();&nbsp; &nbsp; alice.setHandStrategy(new OnlyBlockHandStrategy());&nbsp; &nbsp; User bob = new User();&nbsp; &nbsp; bob.setHandStrategy(new OnlyScissorsHandStrategy());&nbsp; &nbsp; // …………}</pre><p>さて，ボブはアリスに全敗を喫し，高級寿司を奢らされる羽目になりました・・・．</p><p>という感じで，ひとつのクラスのとある区画（アルゴリズム）をごっそり入れ替えることができる，Strategyパターンについて紹介しました．</p><p>ちなみにこれ，こうすると見たことありませんか？</p><pre class="brush:java;">class User {&nbsp; &nbsp; @Autowired&nbsp; &nbsp; private HandStrategy handStrategy;&nbsp; &nbsp; // …………}</pre><p>そうですね，Spring Frameworkでも使用されているDependency Injectionですね．<br>どの戦略を入れるかはDIコンテナに依存し，中身をごっそり変えることができます．</p><p>もはや無意識のうちに使ってしまうぐらいの超頻出デザインパターンなので，ぜひ理解しましょうー</p>
]]>
</description>
<link>https://ameblo.jp/hamaji-dev/entry-11566599521.html</link>
<pubDate>Fri, 05 Jul 2013 01:23:07 +0900</pubDate>
</item>
<item>
<title>byobu（tmux）でシンクロ状態の分割ウィンドウから別々のサーバにログインする方法</title>
<description>
<![CDATA[ <p>こんにちは．はまじです． <br><br>本日はTIPSという感じの記事を投稿します． <br><br>前半だらだらと余計なこと書いてますので，解法だけ見たい方は記事の一番最後ご覧ください．</p><br><h2>byobuについて（導入編）</h2><br><p>最近サーバ管理でログを確認するために，複数台のサーバに<strong>個別で</strong>ログインして<code>less</code>コマンドや<code>grep</code>コマンド叩いてるわけなんですが，10台超えてくるとさすがに面倒になってきました． <br><br>最低でも，複数のサーバの状態をひとつの画面で見たいと思ったので，byobu を導入いたしました．</p><br><p><a href="https://launchpad.net/byobu">byobu</a> <br><br>こちらは公式ホームページです．</p><br><p><a href="http://d.hatena.ne.jp/shim0mura/20111005/1317819710">ターミナルにscreenではなくbyobuを使うべき100の理由</a> <br><br>ちょっとアレな解説ですが，基本的な使用方法を抑えている簡単なマニュアルです</p><br><p>業務中，複数のサーバに対してアプリのデプロイをすることになったので，デプロイ先のサーバにログインして，ログを<code>tail -f</code>で表示し，確認作業を行う必要がありました． <br><br>ただ，それが1台のサーバだけではなく，複数同時にデプロイすることになったので，デプロイ先の数だけターミナルを立ち上げてそれぞれサーバにログインして・・・という面倒な作業をおこなっておりました． <br><br>さらに，10個ぐらい同時にターミナルウィンドウが立ち上がってるせいで，<code>Alt+TAB</code>でウィンドウ間を移動するのが困難であり，いちいちマウスを使ってウィンドウを選択しなければなりません． &nbsp;</p><br><p>byobuでは，1つのウィンドウを複数に分割でき，ウィンドウ間をキーボード操作で簡単に移動することができます．<br><code>Alt+TAB</code>ではどこに飛ぶかもわからない状態でしたが，byobuを使うことで上記のウィンドウ選択にマウスを使う煩わしさから解放され，思った場所へすぐに移動することができるようになりました．</p><br><h2>byobuですべての分割ウィンドウにコマンドを送る方法</h2><br><p>で，確かに便利にはなったのですが，<strong>どうせならサーバに一括でコマンド送信したいですよねー！</strong>という想いがでてきました． <br><br>各サーバで実行する（ログ確認用の）コマンドは全く同じなので，複数のウィンドウに対して一括でコマンドを送信したいわけです． <br><br>ということで，色々調べておりました．</p><br><p>byobuはscreenをより使いやすくしたという位置づけですが，スタンドアロンではなくバックエンドにscreen/tmuxが動いておりp，そのフロントにbyobuが動いている，という感じです（合ってる？）． <br><br>なので，byobuのバックエンドがtmuxであれば，tmux専用のオプションもbyobuで使用することができます．</p><br><p>ということで，byobuで以下のコマンドが使用出来ます．</p><br><pre class="brush: shell;">byobu set-window-option synchronize-panes on</pre><br><p>こうすることで，1つのシェルのなかで分割されたすべてのウィンドウに同じコマンドを送ることができます．</p><br><p>「やったーこれでログ管理楽になるぞー」と思いきや，面倒な事態に． <br><br><strong>サーバにログインした後ではbyobuのset-window-optionを実行できない</strong>という問題が起きました．</p><br><p>まぁ考えたら当たり前なんですが，ローカルから各分割ウィンドウ（ログインサーバ）に対してコマンドを送る方式になっているので，<strong>サーバにログインする前にset-window-optionを実行する</strong>必要があります．</p><br><p>で，さきにset-window-optionを実行しちゃうと，ここで弊害が．</p><br><pre class="brush: shell;">ssh -l hamaji-dev myserver01</pre><br><p>例えば，サーバが10台あって，それぞれmyserver01～myserver10までホスト名が割り振られていたとすると，set-window-optionを先に実行すると，すべての分割ウィンドウで上記コマンドが実行され，同じサーバにログインしてしまうという問題があります．</p><br><h2>byobuで複数ウィンドウから別々のサーバにログインする方法</h2><br><p>前置きが超長くなったのですが，シンプルな解決策です． <br><br>各分割ウィンドウに対して，同じ変数を用いてログイン先をそれぞれ指定する方法です．</p><br><pre class="brush: shell;">% login_to=myserver01<br>% # set login_to variables on each divided window<br><br><br>% byobu set-window-option synchronize-panes on<br>% ssh -l hamaji-dev ${login_to}<br><br><br>$ grep hogehoge /path/to/log</pre><br><p>どうでしょうか？初回実行時は「気持ち悪ｗｗｗ」と思いましたが，超便利です． <br><br>ちゃんと同じコマンドが送られるように，各ウィンドウの同期（目視）する必要はありますが，1回のコマンドでできるのは超便利です． <br><br>とは言うものの，各分割ウィンドウで変数設定しないといけないのが若干面倒ですね・・・． &nbsp;</p><br>
]]>
</description>
<link>https://ameblo.jp/hamaji-dev/entry-11559461992.html</link>
<pubDate>Mon, 24 Jun 2013 19:48:29 +0900</pubDate>
</item>
<item>
<title>JavaのGenericsについて</title>
<description>
<![CDATA[ <p>お久しぶりです．はまじです．</p><br><p>今日はJavaのGenerics（ジェネリックス）について，Effective Javaを読みつついろいろ試験コード書きながら紹介していこうと思います． <br><br>自分もGenericsについて完全に理解していなかったので，自分の勉強も兼ねてますｗ <br><br>そのまえに，前提として以下のような関係のクラスがあると想定しています．</p><br><pre class="brush: java;">class Card {<br>}<br>class Joker extends Card {<br>}</pre><br><h3>初級編</h3><br><p>Genericsについてあまり知らなくても，こんなコードを頻繁に見かけるのではないかと思います．</p><br><pre class="brush: java;">List&lt;String&gt; list = new ArrayList&lt;String&gt;();</pre><br><p>この <code>list</code> には，<code>String</code> と，<code>String</code> を継承したクラスのみをリストに格納することができます． <br><br>これを<strong>型安全である</strong>と言います．そして，指定した <code>String</code> クラスのことを総称して<strong>パラメータ</strong>と言います．<br>こうすることで，<code>list</code> には <code>String</code>（とその子クラス）しか入れられない，入っていないことが保証されるため，コンパイラが容易にエラーを検出することができます．</p><br><p>では型安全でないコードとはどういうものかというと，こんなコードです．</p><br><pre class="brush: java;">List list = new ArrayList();</pre><br><p>このコードをコンパイルした時に，警告が出ると思います． <br><br>これは型チェックされていないことによる警告で，要素に対して呼び出すことのできるメソッドも限られる上，キャストに失敗して実行時エラーになることもありえます．</p><br><p>さきほどの <code>List&lt;String&gt;</code> を<strong>パラメータ化された型</strong>と呼ぶのに対して，<code>List</code> を<strong>原型</strong>と呼びます．</p><br><p>で，さきほどパラメータに指定したクラスと，そのクラスを継承したクラスが許可されれるということをお話ししました． <br><br>なので以下のコードは正常動作します．</p><br><pre class="brush: java;">List&lt;Card&gt; list = new ArrayList&lt;Card&gt;();<br>list.add( new Joker() );</pre><br><p>ちなみに，Java7からインスタンス生成時の型省略が可能（ダイアモンドオペレータ）になりました．<br>つまり，以下の２行は同義です．</p><br><pre class="brush: java;">List&lt;Card&gt; list = new ArrayList&lt;&gt;();<br>List&lt;Card&gt; list = new ArrayList&lt;Card&gt;();</pre><br><h3>中級編</h3><br><p>Genericsを用いてクラス・メソッドを実装する場合，それぞれどのようにすればいいのでしょうか？</p><br><h4>Genericクラスを作る</h4><br><p>Genericクラスはこんな感じで作れます．</p><br><pre class="brush: java;">class MyGene&lt;E&gt; {<br>}</pre><br><p><code>MyGene</code>クラスでは，内部で使用するために<code>E</code>という仮のパラメータを宣言しておくことで，内部でひとつの型として使用することができます． <br><br>こうすることで，フィールドやメソッドの戻り値・引数として仮のパラメータを使用することができます．</p><br><pre class="brush: java;">class MyGene&lt;E&gt; {<br>&nbsp; &nbsp; private E elem;<br><br>&nbsp; &nbsp; public E getElem() {<br>&nbsp; &nbsp; &nbsp; &nbsp; return elem;<br>&nbsp; &nbsp; }<br><br>&nbsp; &nbsp; public void setElem(E elem) {<br>&nbsp; &nbsp; &nbsp; &nbsp; this.elem = elem;<br>&nbsp; &nbsp; }<br>}</pre><br><p>ここで注意しておくべき事項として，<strong>Genericクラス内では仮パラメータのインスタンスを生成できない</strong>ことがあげられます． <br><br>また，今回詳しく触れませんが，仮パラメータの配列の生成も禁止されています．</p><br><h4>GenericクラスではないクラスでGenericメソッドを作る</h4><br><p>さて，Genericクラスではない普通のクラスのなかでも，仮パラメータを使用したメソッドを作ることができます．<br>ということで，Genericメソッドはこんな感じで作成します．</p><br><pre class="brush: java;">public &lt;E&gt; void map(List&lt;E&gt; list, E elem) {<br>&nbsp; &nbsp; //something<br>}</pre><br><p>メソッドの修飾子（public, private, protected, final, static）後と返り値の間に仮パラメータを宣言すると，そのメソッドの宣言部とメソッド実装内部で仮パラメータを使用することができます．</p><br><p>ちなみに，仮パラメータに対して制限をかけることもできます． <br><br>例えば，「<code>Card</code>クラスとその子クラスだけを許可したい」という場合は，それぞれ下記のようになります．</p><br><pre class="brush: java;">class MyGene&lt;E extends Card&gt; {<br>&nbsp; &nbsp; // can use methods defined in Card class.<br>}<br><br>class NonGene {<br>&nbsp; &nbsp; public &lt;E extends Card&gt; E something(E elem) {<br>&nbsp; &nbsp; &nbsp; &nbsp; // can use methods defined in Card class.<br>&nbsp; &nbsp; }<br>}</pre><br><p>こうすることで，仮パラメータ<code>E</code>は，<code>Card</code>クラスかその子クラスであることが保証され，<code>Card</code>クラスで宣言されたpublicなメソッドやフィールドを使用することができます．<br>なお，<code>&lt;E extends Card&gt;</code> のことを，<strong>境界型パラメータ</strong>と呼びます．</p><br><h3>上級編</h3><br><p>さて，このコードは「正常動作」「実行時エラー（もしくは実行時意図しない結果）」「コンパイルエラー」のどれでしょう？</p><br><pre class="brush: java;">List&lt;Card&gt; list;<br>list = Arrays.asList(new Joker[5]);</pre><br><p>答えは <span style="color:white;">コンパイルエラー</span> です．</p><br><p>何故か考えていきましょう．</p><br><p><code>list</code> は <code>List&lt;Card&gt;</code>型のインスタンスです． <br><br>それに対して，<code>Arrays#asList</code> は（仮パラメータをTとして） <code>T[]</code>型を引数とし，<code>List&lt;T&gt;</code>型を返します． <br><br>つまり，<code>Arrays.asList(new Joker[5])</code> は <code>List&lt;Joker&gt;</code> を返すわけです． <br><br>JokerクラスはCardクラスを継承してはいますが，<strong><code>List&lt;Joker&gt;</code> は <code>List&lt;Card&gt;</code> を継承しているわけではない</strong>ので代入できない，ということになります． <br><br><code>ArrayList&lt;Card&gt; list = new ArrayList&lt;Joker&gt;();</code> が通らないのと一緒ですね．</p><br><p>これを回避する方法が次のようになります．</p><br><pre class="brush: java;">List&lt;? extends Card&gt; list;<br>list = Arrays.asList(new Joker[5]);</pre><br><p>このワイルドカードの使用方法によって，<code>list</code> に代入できるのは <code>List&lt;Card&gt;</code> をはじめ，<code>Card</code>クラスを継承したクラスをパラメータ型としたジェネリック型（ややこしい！）です． <br><br>なお，<code>List&lt;? extends Card&gt;</code> のことを <strong>境界ワイルドカード型</strong> と言います．</p><br><p>ちなみに逆（<code>Collections#toArray()</code> ）はどうでしょうか？</p><br><pre class="brush: java;">List&lt;Joker&gt; list = new ArrayList&lt;&gt;();<br>Card[] cards = list.toArray(new Joker[0]);</pre><br><p>これは問題なく通ります． <br><br><code>Card[] cards = new Joker[5];</code> が通るのと同じ原理です．</p><br><p>しかしながら，以下のコードはコンパイルエラーを検出してくれません・・・． <br><br>実行時エラー（ArrayStoreException）で落ちます．</p><br><pre class="brush: java;">List&lt;String&gt; list = new ArrayList&lt;&gt;();<br>Card[] cards = list.toArray(new Card[0]);</pre><br><p><code>toArray()</code>の内部で（厳密には違いますが ）引数の配列の要素に対して代入をしているわけです．</p><br><p>最後に，ワイルドカードを使用した問題を紹介します． <br><br>どうなるでしょうか？</p><br><pre class="brush: java;">List&lt;? extends Card&gt; list = new List&lt;&gt;();<br>list.add( new Card() );</pre><br><p>答えは <span style="color:white;">コンパイルエラー</span> です． <br><br>ワイルドカードのパラメータに対しては，<strong>null以外のいかなる要素も代入することができません</strong><br><br>(参照：Effective Java P.111)． <br><br>これはコンパイラが防いでいるらしいです． <br><br>Eclipseのコンテンツアシスト等の補完機能で確認すると，null型しか代入できないような補完内容になると思います．</p><br><h3>最後に</h3><br><p>アプリ実装程度なら，中級以上のテクニックはあまり使わないとは想いますが，知っておくことで実装の幅が広がるのではないでしょうか？<br>今回，ブログの記事を書きながらEffective Javaを読みつつ，コードを書いて確かめることによって，とても勉強になりましたし，Generics使ってライブラリ作ってみたくなりました．</p><br><h3>おまけ</h3><br>SyntaxHighlightがしょぼいので、ちょっとずつ変えていきます・・・。
]]>
</description>
<link>https://ameblo.jp/hamaji-dev/entry-11552253892.html</link>
<pubDate>Fri, 14 Jun 2013 20:39:04 +0900</pubDate>
</item>
<item>
<title>Chain of Responsibilityパターン</title>
<description>
<![CDATA[ <p>こんにちは．はまじです．</p><br><p>今回からデザインパターンシリーズということで，各回１つずつ（2つもあるかも）デザインパターンをご紹介していきます．</p><br><br><h2>Chain of Responsibility パターン</h2><br><p>Chain of Responsibility パターンは，いわゆる「責任のたらい回し」です．<br><br>自分自身の手に負えないものは別のやつに任せよう，という感じです．<br><br>普通やってしまいそうな，大元のクラスのメソッドのなかで if文を山のように書くというクソみたいな方法が，このパターンを適応するとすごいシンプルになります．</p><br><p>最近ポーカーの役判定プログラムを書いていましたが，複合役のないポーカーではまさにうってつけのパターンだと言えます．</p><br><p>試しにパターン適応前のコードの例をお見せします．</p><br><br><br><pre class="brush: java;">public int getMatchedPokerHand(Player player) {<br>&nbsp; &nbsp; Hand hand = player.getHand();<br>&nbsp; &nbsp; if (hand.isRoyalStraightFlash()) {<br>&nbsp; &nbsp; &nbsp; &nbsp; return ROYAL_STRAIGHT_FLASH;<br>&nbsp; &nbsp; }<br>&nbsp; &nbsp; if (hand.isStraightFlash()) {<br>&nbsp; &nbsp; &nbsp; &nbsp; return STRAIGHT_FLASH;<br>&nbsp; &nbsp; }<br>&nbsp; &nbsp; if(hand.isFourCards()) {<br>&nbsp; &nbsp; &nbsp; &nbsp; return FOUR_CARDS;<br>&nbsp; &nbsp; }<br>&nbsp; &nbsp; // continues...<br>}<br></pre><br><p>普通のポーカーなら役の数が少ないのでまだましですが，これが100個とかになってくると発狂してきます．</p><br><p>麻雀のような複合役のあるものには適応しづらいですが，判定方法が複雑かつ順序が決まっているものに対して効果抜群の効力を発揮出来ます．</p><br><br><br><h3>設計</h3><br><br><br><p>こんなかんじです．</p><br><p></p><p><a href="http://blog.ameba.jp/ucs/entry/srventryupdateinput.do?id=11519676049#"></a></p><p><a href="http://stat.ameba.jp/user_images/20130428/01/hamaji-dev/52/ba/p/o0800060012516346155.png"><img src="https://stat.ameba.jp/user_images/20130428/01/hamaji-dev/52/ba/p/o0800060012516346155.png" style="width: 480px; height: 360px; border: none;" ratio="1.3333333333333333" id="1367081738052" class="selected"></a></p><p></p><br><p>役クラスを抽象クラスにしておき，それを継承した子クラスで判定方法実装するという形になっています．</p><br><br><h3>コード</h3><br><p>とりあえず重要なところだけを抜粋してお見せします．<br><br>PlayerクラスとかHandクラスとか，中身は妄想してください．<br><br>あと，AbstractPokerHand#matches の引数がPlayer型なのは，可読性向上のためにわざとやってます．</p><br><br><br><h4>AbstractPokerHand.java</h4><br><pre class="brush: java;">public abstract class AbstractPokerHand {<br>&nbsp; &nbsp; private AbstractPokerHand nextPokerHand;<br>&nbsp; &nbsp; private String pokerHandName;<br><br>&nbsp; &nbsp; public AbstractPokerHand(String pokerHandName) {<br>&nbsp; &nbsp; &nbsp; &nbsp; this.pokerHandName = pokerHandName;<br>&nbsp; &nbsp; }<br>&nbsp; &nbsp; public AbstractPokerHand setNext(AbstractPokerHand next) {<br>&nbsp; &nbsp; &nbsp; &nbsp; this.nextPokerHand = next;<br>&nbsp; &nbsp; &nbsp; &nbsp; return next;<br>&nbsp; &nbsp; }<br>&nbsp; &nbsp; public final AbstractPokerHand getMatchedPokerHand(Player player) {<br>&nbsp; &nbsp; &nbsp; &nbsp; if ( this.matches(player) ) {<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return this;<br>&nbsp; &nbsp; &nbsp; &nbsp; } else if (nextPokerHand != null) {<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return nextPokerHand.getMatchedPokerHand(player);<br>&nbsp; &nbsp; &nbsp; &nbsp; } else {<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return null;<br>&nbsp; &nbsp; &nbsp; &nbsp; }<br>&nbsp; &nbsp; }<br>&nbsp; &nbsp; protected abstract boolean matches(Player player);<br><br>&nbsp; &nbsp; @Override<br>&nbsp; &nbsp; pubilc String toString() {<br>&nbsp; &nbsp; &nbsp; &nbsp; return "Your hand is " + this.pokerHandName;<br>&nbsp; &nbsp; }<br>}</pre><br><br>キモなのが，matchesメソッドを抽象メソッドにすることです．<br><br>各子クラス（具体的な役のクラス）で，与えられた手と自分自身の役が一致しているかを判定するアルゴリズムを実装します．<br><br><h4>RoyalStraightFlash.java</h4><br><pre class="brush: java;">public class RoyalStraightFlash extends AbstractPokerHand {<br>&nbsp; &nbsp; public RoyalStraightFlash() {<br>&nbsp; &nbsp; &nbsp; &nbsp; super("Royal Straight Flash");<br>&nbsp; &nbsp; }<br><br>&nbsp; &nbsp; protected boolean matches(Player player) {<br>&nbsp; &nbsp; &nbsp; &nbsp; Hand hand &nbsp;= player.getHand();<br>&nbsp; &nbsp; &nbsp; &nbsp; return hand.isFlash() &amp;&amp;&nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; hand.containsCardNumberOf(10) &amp;&amp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; hand.containsCardNumberOf(11) &amp;&amp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; hand.containsCardNumberOf(12) &amp;&amp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; hand.containsCardNumberOf(13) &amp;&amp;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; hand.containsCardNumberOf(1);<br>&nbsp; &nbsp; }<br>}</pre><br><br><br><h4>TwoPairs.java</h4><br><pre class="brush: java;">public class TwoPairs extends AbstractPokerHand {<br>&nbsp; &nbsp; public TwoPairs() {<br>&nbsp; &nbsp; &nbsp; &nbsp; super("Two Pairs");<br>&nbsp; &nbsp; }<br><br>&nbsp; &nbsp; protected boolean matches(Player player) {<br>&nbsp; &nbsp; &nbsp; &nbsp; Hand hand = player.getHand();<br>&nbsp; &nbsp; &nbsp; &nbsp; return hand.getNumberOfPairs() == 2;<br>&nbsp; &nbsp; }<br>}</pre><br><br><br><h4>Poker.java</h4><br><pre class="brush: java;" =""="">public class Poker {<br>&nbsp; &nbsp; public static AbstractPokerHand getHandRule() {<br>&nbsp; &nbsp; &nbsp; &nbsp; AbstractPokerHand royalStraightFlash = new RoyalStraightFlash();<br>&nbsp; &nbsp; &nbsp; &nbsp; AbstractPokerHand straightFlash = new StraightFlash();<br>&nbsp; &nbsp; &nbsp; &nbsp; AbstractPokerHand fourCards = new FourCards();<br>&nbsp; &nbsp; &nbsp; &nbsp; // continues…<br>&nbsp; &nbsp; &nbsp; &nbsp; AbstractPokerHand onePair = new OnePair();<br>&nbsp; &nbsp; &nbsp; &nbsp; AbstractPokerHand noPairs = new NoPairs();<br>&nbsp; &nbsp; &nbsp; &nbsp; royalStraightFlash.setNext(straightFlash).setNext(fourCards)<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .setNext(continues…).setNext(onePair).setNext(noPairs);<br>&nbsp; &nbsp; &nbsp; &nbsp; return royalStraightFlash;<br>&nbsp; &nbsp; }<br><br>&nbsp; &nbsp; public static void main(String[] args) {<br>&nbsp; &nbsp; &nbsp; &nbsp; Player player = new Player();<br>&nbsp; &nbsp; &nbsp; &nbsp; AbstractPokerHand handRule = getHandRule();<br>&nbsp; &nbsp; &nbsp; &nbsp; player.setHand( Hand.createStraightFlashHand() );<br>&nbsp; &nbsp; &nbsp; &nbsp; System.out.println( handRules.getMatchedPokerHand(player) );<br>&nbsp; &nbsp; &nbsp; &nbsp; // =&gt; Your hand is Straight Flash<br>&nbsp; &nbsp; }<br>}</pre><br><br><p>どうでしょうか？<br><br>if文の数も2回で済み，ネストもほとんどなく実装できます．<br><br>開発現場でガード節っぽい if文が山のように出てきたときにこのパターンを適応できないか考えてみましょう！！</p><br>
]]>
</description>
<link>https://ameblo.jp/hamaji-dev/entry-11519676049.html</link>
<pubDate>Sun, 28 Apr 2013 01:32:32 +0900</pubDate>
</item>
<item>
<title>アメブロのh2タグの直後に線（hrタグ）を入れる方法</title>
<description>
<![CDATA[ こんにちは。はまじです。<br>以前のエントリーで<a href="http://ameblo.jp/hamaji-dev/entry-11505066978.html" target="" title="">Markdown使うと便利だと紹介しました</a>けれども、表示が気持ち悪いですよね。<br><br><p><a href="http://stat.ameba.jp/user_images/20130425/18/hamaji-dev/84/c5/p/o0471052712513415973.png"><img src="https://stat.ameba.jp/user_images/20130425/18/hamaji-dev/84/c5/p/t02200246_0471052712513415973.png" style="width:220px; height:246px; border:none;" ratio="0.8943089430894309" id="1366882626779"></a><br><br><br>簡易記法系の言語の風習？として、H1タグやH2タグ直下に下線（hrタグ）が引かれています。<br>アメブロでもできないかいろいろ試行錯誤してみた結果、フリープラグインで解決することができました。<br><br>アメーバのブログ管理画面（投稿画面）の左のメニューから、「プラグイン追加」という項目があります。<br>そこに飛んだ後、「フリープラグイン」というタブを選択すると、空欄のテキストボックスが出るはずです。<br>そこに以下のHTMLをコピペしてください。<br></p><br><br><pre class="brush: css;">&lt;style type="text/css"&gt;<br>article h2 {<br>&nbsp; border-bottom: 1px solid #999;<br>}<br>&lt;/style&gt;&nbsp;<br></pre><br><br>その後保存し、画面の手順にしたがって、サイドバーにフリープラグイン設置しましょう。<br><br>こうすることで、記事内のh2タグ全てにアンダーラインが引かれます。便利！！！<br><a href="http://ameblo.jp/hamaji-dev/entry-11505066978.html" target="" title="">上記の画像だった記事</a>も、今ではちゃんと線が引かれて見やすくなっています！<br><br>この調子でどんどん改造していきましょう。<br>（ちなみに自分はすでに<a href="http://alexgorbatchev.com/SyntaxHighlighter/" target="" title="">SyntaxHighlighter</a>入れてるせいで、文字数制限に引っかかりそうです。やばい）
]]>
</description>
<link>https://ameblo.jp/hamaji-dev/entry-11518167785.html</link>
<pubDate>Thu, 25 Apr 2013 17:16:33 +0900</pubDate>
</item>
<item>
<title>熱狂しすぎた</title>
<description>
<![CDATA[ <p>こんにちは，はまじです．</p><br><p>技術研修が始まってもうすぐ1週間ほどたちます．<br><br>今はJavaの基礎的な講義を受けつつ，チャレンジ問題を解いています．<br><br>解いたチャレンジ問題は，何名かのプログラムがピックアップされて講師とともにコードレビューしています．</p><br><p>そんななか，今日はちょっと反省したいことがあってブログを書きました．<br><br>内容に即しましては，<a href="http://ameblo.jp/matabesu/entry-11513320216.html">matabesuさんのブログ</a> を先にご覧になってからお読みください．</p><br><h2>「怖かったよ」</h2><br><p>コードレビューすごい好きなんですが，我を忘れてしまうことがあります．<br><br>新しくアプリを開発することより，他人のコードを読んで学び，他人のコードをより良くしたい気持ちが強いです．<br><br>今日はそれが行き過ぎてしまったせいで，周りから見た自分が威圧的だったというふうに教えてもらいました．</p><br><p>言われた時にはっとしました．<br><br>たしかに今日は，熱狂しすぎていて，相手の心のことを考えずにコードの良し悪しについて一方的に持論を述べていたときもありました．</p><br><p>また，昨日は <a href="http://shibuyarb.doorkeeper.jp/">Shibuya.rb</a>というプログラミング言語Rubyのコミュニティイベントに参加していたこともあって，レビューに出られませんでした．<br>昨日のレビュー中のことに関して，<a href="http://ameblo.jp/matabesu/entry-11513320216.html">matabesuさんのブログ</a> を教えていただいたので読んだところ，かなりグサグサささりました．<br><br>心に留めて，明日以降自分の態度改善に尽力したいと思っています．</p><br><h2>やめろ</h2><br><p>コードレビューでは，とあるツールを使用しているんですが，このツールにはお遊び機能があります．<br><br>ソースの指定行やソース全体にコメントを投稿することができるのですが，隠し機能としてコマンドコメントを使用することができます．<br><br>各プロジェクト毎にHP（体力）が設定されており，コマンドコメントで増減できるという，遊び心満載のツールです．</p><br><p>ですが，今日はこの隠し機能が悪用され，レビュー中にも関わらず，コメントが荒れることになりました．<br><br>さらにまずいことに，このHPがなくなると画面全体がブルースクリーンになるブラックジョーク的なものが存在し，レビューが妨害される事件が発生しました．</p><br><p>さすがに耐えかねて，名指しでコメントを発しました．</p><br><blockquote><p>○○○，レビュー止まるからやめろ</p></blockquote><br><p>指名相手はよく話しているので，向こうも深く受け止めはしなかったと思いますが，同じプロジェクトを見てる全員にこのコメントが見えたせいか，一気にコマンドコメントがなくなりました．<br><br>おそらくここで空気が変わり，まじめに取り組むようになった人，コメントをやめて別の趣味に行った人など，様々あったと思います．</p><br><p>別の言い方をすると，<strong>場の空気を凍りつかせてしまった</strong>とも言えます．</p><br><p>これは自分の言い方の仕方が悪かったせいで，恐怖感を植えつけてしまったのかもしれません．<br><br>コマンドコメントがなくなって安堵感が得られた反面，周りの皆に対して空気を壊してしまったという問題がありました．<br><br>これは今後気をつけるべき事項であり，1対1でしゃべるのではなく，周りの人達がその会話を見ているという意識を，もう少し持つ必要があると痛感しました．</p><br><h2>最後に：自分からのお願い</h2><br><p>まず，同じ会社の同期として，他人のコードをレビューするという研修の一環であるというときに，遊び呆けてさらには妨害するという行為を許せません．<br><br>僕らはすでに社会人として，会社からお金をもらって研修を受けているのに，その報酬に対して貢献しないことに対して非常に憤りを感じます．<br><br>このレビュー会は参加必須ではないので，妨害するなら初めから参加しないでほしいです．</p><br><p>大学時代の頃から，他人のコードを見る機会を非常に大切にしていて，コードレビューには本気で取り組むことができます．<br><br>自分にとってソフトウェアエンジニアとして最も成長できる機会がコードレビューだからだと確信しています．<br><br>誰だって自分が本気で取り組んでいることに対して邪魔が入るのは嫌で，その人に暴言を吐くことだってあると思います．<br><br>つまらないコードレビューをやっていると思うかもしれませんが，なかには全力で取り組んでいる人がいることを忘れず，邪魔をしないように気を配っていただければ，僕にとってこの上ない幸せだと思っています．</p><br>
]]>
</description>
<link>https://ameblo.jp/hamaji-dev/entry-11514077341.html</link>
<pubDate>Fri, 19 Apr 2013 00:15:51 +0900</pubDate>
</item>
<item>
<title>成長に関するありがたいお言葉 その1</title>
<description>
<![CDATA[ こんにちは。はまじです。<br><br>今日は役員のうち4名の方からご講演をいただきまして、講演して頂きました。<br>それぞれのお話を簡単にまとめて、学んだことをピックアップしていきます。<br><br><br><h2>曽山さん流 成長の習慣</h2><br><h3>成長とは</h3><br><p><strong>知らない自分に出会うこと</strong></p><br><ol><br><li>限界に挑戦する</li><br><li>挫折する</li><br><li>挫折を乗り越えた時に成長する</li><br></ol><br><h3>成長の習慣</h3><br><ol><br><li>年上の人に相談</li><br><li>自分の思考を紙に書く</li><br><li>経験者の本を読む</li><br></ol><br><h3>学んだこと</h3><br><p>会社の人間の特徴を見抜く人事の部長らしい（上から目線すみません；；）アドバイスをいただきました．<br><br>自分の限界に挑戦することおよび他人を参考にするということが重要であると感じました．</p><br><h2>小池さん流 成長の習慣</h2><br><h3>やりたいことを実現させるには？</h3><br><p>自分自身のサイズをどんどん大きくし，やりたいことを自分の中に取り込む（イメージ）</p><br><h3>成長の習慣</h3><br><ol><br><li>自分サイズをどんどん大きくすることを心がける</li><br><li>成功イメージを追求する</li><br><li>よりタフな（難しい）道を選ぶ</li><br></ol><br><h3>学んだこと</h3><br><p><br>非常に簡素にまとめていただいたアドバイスですが，中身としては「やりたいことをできる自分になる」という趣向だと感じました．<br>今できなくても，それをするために自分をどんどん大きくしていこう，というありがたいアドバイスです．<br><br>「野望」を「目標」にするために自分を大きくしたい，そう思いました．</p><br><h2>山内さん流 成長の習慣</h2><br><h3>サバイバルレースが開幕</h3><br><p><br>強力なライバルが多数いるなか，どう生き残っていくかが重要</p><br><h3>成長の習慣</h3><br><ol><br><li>新人こそ巧遅拙速であれ（巧くて遅いより，拙くても速くあれ）</li><br><li>大局観と嗅覚を身に付けるべし</li><br><li>学習レバレッジ（小さな努力で大きな学習効果）を最大化せよ</li><br><li>大志に本気になれ</li><br><li>身近に目標を創れ</li><br><li>反骨精神と素直さを共存させる</li><br><li>不可能を可能にする心構え</li><br><li>チャンスに慣れるな（本当のチャンスは10年に1度くらいしかこない）</li><br><li>自分自身で答えを必ず持つ（創る）</li><br><li>アンダーグラウンド（現場）が一番タフだ</li><br><li>とことん1番にこだわれ</li><br><li>隣に座っている仲間の成長に責任を持て</li><br></ol><br><h3>学んだこと</h3><br><p><br>マイクを持たせた自分みたいな感じで（笑），非常に多くのアドバイスをいただきました．<br>これらひとつひとつに山内さんの想いが篭っていることでしょう．<br><br>全てを満たすことは難しいとは思いますが，このなかで特に自分が足りていないもの（特に4番だと自負しています）を磨こうと思いました．</p><br><h2>内藤さん流 成長の習慣</h2><br><h3>「市場」マーケットの本質を見ぬくための習慣</h3><br><ol><br><li>マーケット（今）をよく見る</li><br><li>機会を集中する</li><br><li>相対的に考える</li><br><li>競争のルールを理解する</li><br><li>限られた時間から，タスクと目標と優先順位を決める</li><br><li>目標をマネジメント（動的変更）する</li><br><li>フローとストックのバランスをとって学習する</li><br></ol><br><h3>学んだこと</h3><br><p><br>これまでとは打って変わり，非常に具体的かつ現実的なアドバイスをいただきました．<br>「今」に最も注視し，最大限の力を「今」発揮しないことには，成長した未来がないという，内藤さんの暗示だと感じました．<br><br>刻々と変化する状況に応じて目標を変更するというアドバイスも，その現れなのではないか，と捉えています．<br><br>僕としては，一番しっくりくるアドバイスをいただけて，非常に参考になったと感じております．<br><br>与えられた機会を大切にし，注力することを心がけて取り組む所存です．</p><br><h2>まとめ</h2><br><p><br>CA8という役員8名のうち，4名からありがたい講演を賜りまして，非常に感謝しております．<br><br>後日，残り4名からも講演していただけるということは，またとない機会ですので，取りこぼしの無いよう，しっかりと血肉にしていきたいと考えています．</p><br>
]]>
</description>
<link>https://ameblo.jp/hamaji-dev/entry-11508058309.html</link>
<pubDate>Tue, 09 Apr 2013 23:46:13 +0900</pubDate>
</item>
</channel>
</rss>
