2016年1月7日木曜日

処理を短くする

ねこもちです。

古いプログラムを修正していると、そのプログラムが非常に「長大」であると気づくことがあります。
一つの関数(メソッド)が数百・数千行に及んでいることもあります。

こういうのは、大体
「どこにあるデータがいつ更新されるのか、追うのが難しい」
「ifのネストが多く、ifとelse節の対比が難しい」
「途中でreturnすればいいのに、制御フラグに値をセットした上で最後まで処理を続けるので、処理を追うのが難しい」
「途中でreturnしているが、どの条件でそこに入るのかを追うのが難しい」
「同じようなコードが何回も出てくる(が、100%同じと断言できないので、結局すべて追う必要がある)」
など、その他のいろいろな「難しいポイント」を含んでしまっていることも多いのです。


■「どこにあるデータがいつ更新されるのか、追うのが難しい」
これについては、下記の方法を取ると、難しさが減ります。
「変数は使う直前で定義する」
「できるだけローカル変数にする」
「できるだけImmutableな設計にする」

たとえば、Webアプリケーション(ASP.NETなど)の例を挙げます。

public class XxxxPage : Page
{
private string _a = "";
private int _b = 0;

public void Page_Load(object sender, EventArgs e)
{
_a = Request.QueryString["a"];
if( string.IsNullOrEmpty(_a) ) {
return;
}
_a = _a.Trim();

if( IsPostBack )
{
_b = int.Parse(_a);
}
}

public void OnXxxxEvent(object sender, EventArgs e)
{
// _a, _bを使用するコード
}
}

このようになっていると、OnXxxxEvent()が呼ばれるときに、
・事前にPage_Load()が呼ばれていること
・Page_Load()内で、どのようなルールで_a, _bの値が決まるのかを知っていること
の2点がわかっていないと、OnXxxxEvent()を書くのが難しくなります。
また、他のメソッドが_a, _bの値を変更する可能性もあり、
結局すべてのプログラムを調べないと、挙動がわからないということになります。

public class XxxxPage : Page
{
public void Page_Load(object sender, EventArgs e)
{ // 何もしない。
}

public void OnXxxxEvent(object sender, EventArgs e)
{
string a = (Request.QueryString["a"] ?? "").Trim();
int b = !string.IsNullOrEmpty(a) && IsPostBack
? int.Parse(a)
: 0;
// a, b を使用するコード
}
}

このように、「使用する箇所で」変数を定義し、同時に初期化することで、aがなんなんか、bがなんなのか、
まぎれることがなく、プログラムが非常に明快です。

また、この書き換えの際に、元のコードでは
_a がまず Request.QueryString["a"]を指し、
つぎにそれをTrim()したものを指すようになっていましたが、
書き換え後ではaはRequest.QueryString["a"]をTrim()したものを指し、それを変更しないようにしています。
こうすることで、aという変数がいつでも同じ値になり、プログラムの挙動を理解するのが簡単になります。


その他についてはまた後日。

はじめまして、エンジニアです。


初めてのかた、はじめまして。
ご存知の方、こんにちは。

Zメンです。

今回は私の自己紹介がてら経歴などを書きたいと思います。

生い立ち~学生時代

生粋の北陸生まれ、北陸育ちです。
昨年からHOTなあの雅な県です。
余談ですが左手親指をサムアップし、ちょっと曲げた形が似ているます。

今はエンジニアとして働いていますが、実家が建築関係だったこともあり
高校の時も大学の時も、自分は建築業界にいくんだろうな~とぼんやり思っていました。

ちなみに大学時代は防災と都市デザインの2種を専攻してました。
防災のほうは全国ニュースで流れるような火災の原因分析・解説を教授がやっていたり、
某有名タワーの防災設計を見せてもらったりで意外と面白かったです。

都市デザインはイメージが難しいですが、都市に関わる制度・ソフト・ハード・デザイン等
なんでも研究対象となるような感じです。
どう伝えて良いものか難しいですが、こんなイメージです。

入社~現在

そんな建築畑にいた自分がなんでいまエンジニアをやっているかというと、
スマホに興味があったからです。
当時はまだAndroid1.6がようやく出たような時代でした。
今でこそAndroidも洗練らされたデザイン・操作性ですが、1.6はメカメカしい感じで、
物好きが使ってます、 くらいの感じでした。当然アプリも怪しいものばかり。
未だに有名どころで残っているのはShimejiあたりでしょうか。

そんなわけなのか分かりませんが、現在はスマホ部隊とSEO部隊の管理を担当しています。
ここ一年はGoogleにどっぷり浸かりぎみですが、どんどん新技術を発表してきているので
刺激が多く楽しい毎日を送っています。

おすすめアプリ

そんなわたしが最近注目しているアプリ・おすすめのアプリをいくつか紹介したいとおもいます。

GoogleNowLauncher
ランチャー系はいくつも試してみましたが、動作が重かったりバグが多かったり
メモリ食いまくったりとあまりお勧めしたいものはなかったのですが、ここ半年くらいはもうこれ。
多分もう変えられないとおもいます。やっぱりGoogleさん神。

Favrica
ファッション好きとしてはZOZO系列以外のアプリを探していて、Origamiも結局すぐ使わなくなったのでなにかないかと思っていたところでした。好きなブランドの新着を見るならこれが一番いい。
もうちょっと情報量とEC部分強化されないかなぁ。

E・レシピ
Exiteが運営してるみたいです。料理ポータルアプリは既にたくさんありますが、料理ポータルサイトの雑多なプル・プッシュ情報をカレンダー視点でサジェストしてくれるのがちょっと新しいです。
写真もいいですし、好き嫌いが多い人には向かないかもです。


今後もSEOやスマホ・アプリ系の書き込みが主体になると思いますが、温かい目で見守ってください。
こういうテーマ調べてというのもいただければ可能な範囲で頑張ります。

2016年1月6日水曜日

改めまして、おかだです。


このブログが開設されてから約半年、、

これから記事を整理してみんなで分担して書いていこうという流れになっていますので、
そのトップバッターとして自己紹介をしたいと思います。はずかしい。


おかだと申します。

千葉県出身、辰年生まれのアラサー女です。2012年入社の社会人4年目になります。
社会人デビューからずっと今の会社で働いています。

初年度は自社サービスの営業を1年間担当し、そのあと今の部署に異動してきましたので、エンジニア歴は約3年になります。(自分で書いていて驚きですが、、時は残酷ですね、、)

昨年まではほとんど自社のWEBサービスの開発をしていましたが、昨年からは自社アプリのサーバーサイドの開発を担当しています。


好きなこと?

せっかくアプリ開発チームにいるのでそれを踏まえつつ、私のお気に入りのアプリをいくつか紹介したいと思います♪
プライベート携帯はずっとandroidなので、androidよりになってしまいますがご容赦ください。

Scene

Sceneは写真整理アプリです。
個人的に、出掛ける時に食べたものなど写真を撮ることも多いですし、画像を加工することもまぁまぁありますし、仕事柄キャプチャをとることも結構多いです。
Sceneのいいところは、画像一覧と日付表示が一体化しているところです。
サムネと日付が同列に並んでいることで、写真を見返すのも日記を読み返しているような感覚で楽しむことができます。
日付をタップするとカレンダー型の表示に切り替わるのですが、それもまたかっこよくて素敵なのです。

ギャラリーアプリに困っている方はぜひ使ってみてください^^

google playへGO >>

特に気に入ったのはこの表示。日記みたいで好きです


Google Fit

ご存知の方も多いかもしれませんが、Googleの運動管理アプリです。

これは偶然ストアで見かけたので入れてみたパターンなのですが、機能がシンプルで、わかりやすいのがいいです。
ふつう、ダイエットアプリとか、運動管理とか、食事管理とか、健康系のアプリは、かなりモチベーションの高い人には機能が充実しているものが便利だと思いますが
このGoogle Fitは「特にそこまで運動とかがんばってやるつもりないよ~」という人がとっつきやすいです。

1日の運動(走る、歩く、自転車)の目標値を設定すると、アプリを起動したときに
「いまここまでやったよ!」とゆる~くおしえてくれるだけなのですが
ちゃんと目標を達成するとほめてくれるのも、なんだかいいところ。

人とアプリの気持ちいい関係ってこういう感じなのかな、と思います。

日々自分がどのくらい歩いたり走ったりしているのか、気にはならないけど知りたいな~という方はぜひ使ってみてください^^

google playへGO >>

自分がどれだけ運動していないかを実感できます

スマホゲームも好き

仕事の一環で書いているブログなので、ゲームのことを書くのは少し悩みましたが、ゲームを作っている方々も仕事でやられていると思うので、すこしだけ、、
(紹介したいゲームアプリが多くて書ききれないので、それはまたいつかの機会に、、)

最近はテレビのCMもゲームばっかりで、世の中の人がたくさんゲームしているということなのでしょうが、みなさんはいくつくらいゲームやってますか?
可処分時間も限られますし、そんなに何個も同時に遊べないですよね。。。

そんな私は、ひょんなことから出会ったゲームアプリを、遊ばなくなったからと言ってアンインストールせず、端末にストックしています。
たまにそのストックを見返して、「やっぱりいいゲームだ~」なんて思いながらちょっとだけ遊びます。

だからなんだよって話になってきてしまいましたが、アプリと人の付き合い方っていろいろあって、
アプリの企画は大変、という結論です。



これからもスマホやアプリについての記事を書いていこうと構想していますので、もしよろしければお付き合いください。

おかだでした!

2015年12月28日月曜日

申し訳ない、御社をつぶしたのは私です。 カレン・フェラン著

こんにちは、山田です。

知り合いのお兄さんにおすすめされて
読んでみた本の紹介です。

小学生並みの感想文になりますが、
ご容赦いただければと思います。

http://wrs.search.yahoo.co.jp/FOR=8u2f68dV3ii3eKvAhumeCYUgBT1b7aI0q2Nqf.zc9iVhxiqfgOagmjs.i7RblFZsRaMXjgNUXSlUEuroRG9XciOp2ZmY818eSysNUfLJpNbxC9zLHVPC.pP5.Va2w6BwvfEOjjaM00oAV7qLEzKrdnf8RY3IUiqobx2oz6SUEtjFxEM84S2GtSJLR_zwQa58q16Kgp24FcRFl2rh_mvUrVFvo3OF0kpoL2C.i2UkafjpybX2i9c5pnzqqWsf0KF2dgzq_8ZVv_A3HKrDg3vbXK_4M4d7mczrJIy3h07zsYEVTUo19SQamEfN.56Oj1.Y3h0xAicjzk..5WvnQE9GLNZrnXtHe9AdZO71tHZnbJvbdHtH1QjRbPGgsX43JhEv0zIwrE8spjwZ0dQi.aFwX6oKxmYk8PmipFN1ZLqMcVs2u33z.bDVBGOpbhKqboz179BxJzVKsRCkiV6Y1LR.mmLKodp_fCM6XA886i_iDdd3EbODnHlEsL7GnUqLRAxc4MkzjP9zJNsBA4vqnn2Vnr3Ob8.tj0rd11iKe8aD_8Saq75de.lNDmjswLorj3T3VTA3nu6iLrFRDuy9bHOhWX5Z8qB3h8gmHjH9CQIW3yaQNcVwP.IKu7urFLjXgCIq7Z1yp3Vs_2LVSlKEEI0NBfsWsmWYwCeIPlNvPNdUzzi0RQpae0iw1EQWfygecJPZeiZn69k8zL9mkQ3Zm3UI1tlp0fOJ.dH1ut9yqRYdryHFjzQ_71oWtRACT6ErnCo7_dNw/_ylt=A7dPKSN8P4pW.ksAGOGDTwx.;_ylu=X3oDMTEyNXZwazBxBHBvcwMxBHNlYwNzcgRzbGsDdGl0bGUEdnRpZANqcDAwMDE-/SIG=1eggdbcsv/EXP=1452001596/**http%3A//www.amazon.co.jp/%25E7%2594%25B3%25E3%2581%2597%25E8%25A8%25B3%25E3%2581%25AA%25E3%2581%2584%25E3%2580%2581%25E5%25BE%25A1%25E7%25A4%25BE%25E3%2582%2592%25E3%2581%25A4%25E3%2581%25B6%25E3%2581%2597%25E3%2581%259F%25E3%2581%25AE%25E3%2581%25AF%25E7%25A7%2581%25E3%2581%25A7%25E3%2581%2599%25E3%2580%2582-%25E3%2582%25AB%25E3%2583%25AC%25E3%2583%25B3%25E3%2583%25BB%25E3%2583%2595%25E3%2582%25A7%25E3%2583%25A9%25E3%2583%25B3/dp/4479794336
調べて見ると、少し前に流行った本みたいで、
とあるメーカーから実際に請け負った案件の中で、
つぶれていく会社を目の当たりにする体験談でした。

内容を簡単にまとめると
ビジネスの問題点は人にあるという内容になります。

※ネタバレ注意
・とある赤字部署を、収益がでる形に改善して欲しいと依頼が舞い込むところから始まります。
納期が遅れがちで、当初の生産スケジュールを達成できていない。その原因を調査して欲しいと。
・実際に、その現場の聞き込みをしてみると現場では、「ひとつの生産ラインで、割り込み作業が入る頻度が多く、作業が滞っており困っている。」と言われる。そしてその意見は、現場の監督で止まってしまっているらしいとわかる
一方、営業は遅れた当月の予算を補うために割り込み案件をかき集めている…。

 
何が必要かというと、関わる人のコミュニケーションが不足していることを著者は問題視していました。
営業と、生産者の目的がそれぞれ矛盾しているのに、それでもビジネスを進めてしまっている。
元々はwin-winの関係で成り立つビジネスなのに、だれも喜ばない結果になっている

いろんな人の意見を聞くのは大事なんだと思いました。



他にも似た事例として、人事評価制度が社員をなぜか苦しめているなど面白かったです。

ページネーションに、並び替えや絞り込みがあった場合を調べてみた②

こんにちは山田です。
年末ですね。今年も一年の締めになりました。

年神様を迎えられるように、身辺を整理しましょう。
(山田家では、そもそも鏡餅は幾年も飾っていませんが気持ちだけ)

さて毎度のことながら、グーグルのリファレンスを読んでおり
解読が増えた項目がありました。
 ↓↓↓
コンテンツを指定する
 https://support.google.com/webmasters/answer/1663744?hl=ja 

①canonicalとページネーションは併用できる、そしてページのコンテンツを変更しないパラメータ(たとえばセッション ID)が含まれている場合、ページネーションに記述する

>>rel="next"rel="prev"  は、rel="canonical" と直接関係する概念です。
>>両方を一緒に宣言することができます。
>>たとえば、http://www.example.com /article?story=abc&page=2&sessionid=123 というページには、以下を含めることができます

(例)
<link rel="canonical" href="http://www.example.com/article?story=abc&page=2"/>
<link rel="prev" href="http://www.example.com/article?story=abc&page=1&sessionid=123" /> <link rel="next" href="http://www.example.com/article?story=abc&page=3&sessionid=123" />


 ②コンテンツが変わる場合は?
絞り込みや並び替えの場合ですが、こちらはやはり記述が見当たりません。

SEOのベストプラクシス
https://blog.core-j.co.jp/seo-for-pagination
>>prev/nextで各ページの関連性を指定する際、そのURLを正規化する事はできません。
>>たとえGoogleBotがアクセスしたページ送りのURL にPHPSESSIONなど不要なパラメーターが付与さていても、prev/nextではそのパラメーターを引き継ぐ必要があります。
>>この際、重複イン デックス登録を排除する為に、各ページの正規化されたURLをCanonicalで指定します。

ここの記事を参考にさせてもらうと、
・カノニカルで、URLを正規化することができる
・ページネーションでは、ランディングしたページのパラメータを引き継ぐ必要がある
ということでしょうか?

公式リファレンスのこの記述の部分をまた探してみようと思います。