2016年2月22日月曜日

UX JAM 6 -UX GIRLS Returns- に参加してきました!

どうも、ふみえです。

2016/02/17に"UX JAM 6 -UX GIRLS Returns-" というイベントに参加してきました。
本イベントですが、概要は以下になります。
UX JAMはUX MILK主催の、UXを題材にした「ゆるい」勉強会/交流会イベントです。学術的なUXのセミナーというより、参加者同士でより気軽にUXについて話し合えるような場です。レベル感的にはUX初心者~中級者向けで、LTやスピーチをただ聞くだけではなく、参加者の方も積極的に話したりできる雰囲気作りを心がけています。
とてもライトなイベントで昨年からちょこちょこ参加させていただいておりました。
やはり聴いているだけでは物足りず、以前ご登壇された方からの後押しもあり、今回登壇してまいりました。

前職で私が企画・運営したユーザさんを理解するための取り組みを紹介させていただきました。

UX に興味を持ったきっかけ

私はフロントエンド・エンジニアです。デザインの変更・機能追加/改善などは日々行います。しかし、会議で「この機能についてどう思いますか?」「この機能きっと回遊時間が伸びると思いませんか?」と問われた時に何も反応できないことが多々ありました。私が考えすぎてしまう性格故にそうなっていたのかと思っていました。しかし、UXについて調べてみると、どうやらそれは性格の問題ではなさそうであることがわかりました。

ユーザさんに会いたい!!

私は強く思いました。思い立ったら即実践!!ということで、色々素地のない所で手探り状態で座談会を開催するのに1ヶ月で準備をしました。一応「仮説 → 検証 → レポート → タスク化」というフローを踏みました。

そこで得られた結果や課題はチームの中で共感を呼ぶこともでき、チームの意識を自然と同じ方向に導いてくれます。開発していく時の自身やモチベーションの向上、サービスへの愛も増幅します♡


そんなこんなでこちらからは以上です。

2016年2月19日金曜日

C# 構造体とは

こんにちは山田です。

C#の基本構文でいまいち呑み込めなかった部分について
わからないなりに解説をしようと思います。

~良くわかっていない人による解説~
 
開発言語:C#

構造体というのは一見、「何かの構造概念なのか?」と思ってしまいそうなのですが、
(というか勘違いして覚えていたのですが、)
実はクラスに似ていました。
具体的には、メモリ空間における構造が異なるそうです。
なので、ちょっと変わったクラス、というとらえ方でよさそうだと思います。

■構造体の定義

構造体の定義は、クラスとほぼ同じで、structを用いて定義します。
struct Dog{
 public int price;
 public string name;
 public int getPrice(){
    return price
 }

※ちなみに構造体は初期化が出来ないです。
public int kazu =1; ×

クラスと同様に、状態(field)と振る舞い(method)をメンバにもつことが出来ます。

■クラスと構造体の違い
構造体とクラスは似ていますが、
大きな違いは、参照型か値型かの違いです。

●構造体(値型)
 ・構造体は列挙型と同様で、値型です。
  (変数に直接値が格納されているデータ型です。)
 ・他のクラスや構造体を継承したり、継承元になることはできません。
 ・インターフェイスを実装することは可能。
 ・new演算子を使わなくてもインスタンス化される。


●クラス(参照型)

  例:)文字列、配列、クラス、デリゲート、インターフェースが参照型   

■早い話、どういう時に構造体は使用する?

クラスと構造体のどちらを使うか: C# プログラミング 再入門
http://dotnetcsharptips.seesaa.net/article/417085715.html
 ↑
こちらを参考にさせていただきました。
-----------------------------------------------------------------------------
MSDNのプログラミングガイドから引用します。

構造体は軽量オブジェクトを表すのに適しています。参照型の機能が必要ないのなら、小さいクラスとして実装するよりは構造体として定義した方が、システムにより効率的に処理されることが期待できます。

実際に計測してみると(かなりハイスペックなマシンでデバッグビルド版で計測)、上のサンプルコードにあるクラスと構造体とを10万個づつインスタンス化 してもいづれも2msと差はなし。100万回でクラスが約100msに対し構造体が30msと約3倍の効率の良さは伺える。
これらを「参照型の機能」として、つまりBoxingされるようObject型にキャストする処理を介在させた場合、クラスも構造体も120msぐらいであった。

これって、実際の使用条件等を考えるとほとんど構造体を使う理由がないように思えます。
-----------------------------------------------------------------------------

う~んつまり、C#の構造体の場合は、あまり使う場面がないみたいですね。

■参考文献

クラス-構造体-
http://arc360.info/lecture/6/4.html

値型と参照型 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C
http://ufcpp.net/study/csharp/oo_reference.html

2016年2月16日火曜日

開発初心者がこれだけは知っておいた方が良いこと②

こんにちは!Sです。
前回に引き続き「開発初心者がこれだけは知っておいた方が良いこと」について書いていきます。

今回のテーマは「おかしいところの見つけ方について」です。

ネットで調べて見よう見まねで書いてみたけれど上手く動かない。。。という時に
早くどこがおかしいのかを見つける方法について書いていきます。


<エラー画面が表示されている場合>

①ログを見る
 新規作成の場合は自分でログをはくように設定しないといけませんが、
 既存のファイルの修正であればおそらく既にエラーが起きた際にエラーログを出力するように
 設定されているはずです。
 なのでまずはソースからログの出力先を調べて、ログを見に行きましょう!


<エラー画面は表示されていないが、やりたいことが出来ていない場合>

①デバッグする
 ここがおかしいのかも。という怪しい場所付近にブレークポイントを設けて、
 デバッグして下さい。きっとヒントになるはずです。
 ▼最初にマスターしたいVisual Studioのデバッグ機能 -基本編-
 http://news.mynavi.jp/articles/2008/08/18/debug/

②Response.Writeを使う
複数の処理を連続して行っており、それらのどれが原因かを調べるのに便利です。
例えば...
aに対して処理B、C、Dを連続して行うのであれば一旦それらを分けてみましょう!

Response.Write(a);
Response.Write(b);  //bはaにBの処理をしたもの
Response.Write(c);  //cはbにCの処理をしたもの
Response.Write(d);  //dはcにDの処理をしたもの

これでブラウザにa,b,c,dが表示されるので、処理のどの段階でおかしなことになっているのかが一目瞭然です。


2016年2月12日金曜日

【Android】AppIndexingを設定してみた

こんにちは。エンジニアのKです。

【Android】AppIndexingを実装してみたの続きです。
前回までで最低限必要な実装は完了しましたが、
ディープリンクのテスト方法や、「Google Play Developer Console」、「Search Console」への登録方法でも
公式ドキュメントを読んだだけではピンと来ない部分があったので、補足できればと思います。

ディープリンクをテストする

実装したディープリンクがAppIndexingとして正常に動作するかテストします。
公式ドキュメント:App Indexing の実装をテストするの前半

方法としては、公式ドキュメントにあるADBでインテントを飛ばすやり方と、アプリがインストールされた端末のブラウザで、android-app://のリンクを踏んでみるやり方の2つがあります。

ADBでインテントを飛ばす

端末をUSBで接続し、コマンドラインから公式ドキュメントにあるドキュメントを実行すると、インテントが飛びます。
ディープリンクが正しく実装できていれば、アプリのコンテンツが立ち上がるはずです。
以下は、Android StudioのTerminalで実行した結果です。


実装が上手く行っていない、飛ばすインテントが誤っていると、「Error: Activity not started, unable to resolve Intent」といったエラーが表示されると思いますので、実装に誤りがないかを確認しましょう。

android-app://のリンクを踏む

webページを自由に変更できる環境があれば、aタグにテストURLを埋め込んでブラウザでアクセスします。
そういった環境がない場合は、公式ドキュメントにあるQRコード経由でアクセスすると便利だと思います。
前回の記事でも書きましたが、テストURLは

android-app://com.recipe-app/http/recipe/pierogi-poutine
android-app://com.recipe-app/recipe-app/recipe/pierogi-poutine

といったものになります。


AppIndexing APIをテストする

AppIndexing APIが正常に動作しているかも確認しておきます。
公式ドキュメント:App Indexing の実装をテストするの後半

これもアプリをインストールした端末をUSBでPCに接続し、ターミナルにコマンドを打ち込みます。
AppIndexing APIが起動する処理を通るようにアプリを操作すると、以下の様なログが出力されるはずです。
title, description, appUri, webUriが正しい値になっていればOKです。
マルチバイト文字を含めるとログ出力が文字化けしてしまいますが、URLエンコード処理は不要です。
試しにこのままリリースしてクロールさせたところ、検索結果に表示されるAppIndexingのリンクは文字化けしていませんでした。



Search Consoleにアプリを登録する

まずはSearch Consoleにアプリとしてプロパティを追加します。
公式ドキュメント:アプリの Search Console

Search Consoleにログインし、公式ドキュメントにあるようにandroid-app://のURLでプロパティを追加します。
すると、以下の画像のように、「Androidアプリ」のプロパティが追加されます。




Search Consoleでクロールテストをする

Search Consoleに登録すると、アプリに対しても「Fetch as Google」を行うことができます。(2016/02時点でアルファ版)
テスト対象のアプリは、基本的にはGoogle Playで配布されている最新版のapkですが、この場でapkファイルをアップロードして試す事もできるようです。
言語を選択するセレクトボックスは「日本語」にした方が良さそうです。「英語」のまま実行したらエラーになってしまいました。

広告SDK等が含まれていると、広告で読み込まれる一部リソースがブロックされ「一部完了」のステータスになりますが、
正常にレンダリングされていれば問題ないと思います。


アプリとWebサイトを紐付ける

ここまで確認できたら、あとはアプリとwebサイトを紐付けて、GoogleにAppIndexingしてもらいます。
公式ドキュメント:アプリをサイトに関連付ける
※前提として、ディープリンクに対応したアプリをGoogle Playで公開している必要があります。

紐付け方はGoogle Playから行う方法と、Search Consoleから行う方法があります。
今回はGoogle PlayのサービスとAPIからwebサイトのURLを入力する方法で行ってみました。
すると、Search Console側に「{googleアカウント} が Android アプリ {パッケージID} を {webサイトURL} と関連付ける権限をリクエストしています」といったタイトルのメッセージが届きますので、承認しましょう。

これで、必要な作業は全て完了となります。
ここから徐々にgooglebotのによるアプリクロールが開始され、3-5日程度でSearch Console上でクロールステータスを確認することができると思います。
以下が実際のクロールステータスの画面ですが、クロール開始直後はエラーが大量に発生してしまいました。
ですが、特に何もせず様子を見ていたところ、エラーは0件となり、インデックス数が増加していきました。



インデックス数が増え始めると、その更に数日後(5日程度かかった)、google検索結果にAppIndexingのリンクが表示されるようになると思います。

2016年2月9日火曜日

C# 列挙型 enum

こんにちは山田です。

開発言語:C#

C#の基本構文でいまいち呑み込めなかった部分について
わからないなりに解説をしようと思います。

~良くわかっていない人による解説~

■列挙型とは (enum)
特定の値しか取らないようなものに対して使用します。
たとえば曜日だったら 月~日までの7つのみになります。
この曜日を例に取り上げていこうと思います。

■基本構文

【定義の仕方】
列挙型の宣言はenumをはじめに記述し、つづいて列挙型の名前を記述します。
-------------------------------------------------
enum 列挙型名
{
  メンバー1, メンバー2, …, メンバーn    ←列挙定数
}
-------------------------------------------------

例1)
-------------------------------------------------
enum Week
{
Sun, Mon, Tue, Wed, Thu, Fri, Sat
}
-------------------------------------------------
そしてそれぞれの識別子には0から順番に1ずつ増える整数値が割り当てられます。

Sun:0
Mon:1
Tue:2
 :
Sun:6


例2)
-------------------------------------------------
enum Week
{
 Sun, Mon=100, Tue, Wed, Thu, Fri=200, Sat
}
-------------------------------------------------
もし任意の値を代入すると、そこから1ずつ増加します

Sun:0
Mon:100
Tue:101
Wed:102
Thu:103
Fri:200
Sat:201

例3)
列挙要素の基になる既定の型はintですが、
Int型以外で整数値を使いたい場合は以下ように記述します。
-------------------------------------------------
enum Week : byte
{
 Sun =1
 ,Mon =2
 ,Tue =3
 ,Wed =4
 ,Thu =5
 ,Fri =6
 ,Sat =7
}
-------------------------------------------------
他にはこんな型が使用できます。
byte、sbyte、short、ushort、int、uint、long、ulong


【利用する方法】

識別子を参照する時は以下のように記述します
----------------------------
列挙型名.メンバー名
----------------------------

例4)
using System;

class Sample
{
 protected enum Week : int
 {
 Sun =1
 ,Mon =20
 ,Tue =30
 ,Wed =40
 ,Thu =50
 ,Fri =60
 ,Sat =70
 }

 /// 
 /// 日本語の曜日をただ返すプログラム
 /// 
 protected void SampleProgram(Week[] _day){
  for (int i = 0; i < _day.Length; i++)
  {
   switch (_day[i])
   {
    case Week.Sun: Console.Write("日曜"); break;
    case Week.Mon: Console.Write("月曜"); break;
    case Week.Tue: Console.Write("火曜"); break;
    case Week.Wed: Console.Write("水曜"); break;
    case Week.Thu: Console.Write("木曜"); break;
    case Week.Fri: Console.Write("金曜"); break;
    case Week.Sat: Console.Write("土曜"); break;
   }
  } 
 }

 static void Main()
 {
  Week[] day = new Week[] { Week.Mon, Week.Tue, Week.Wed, Week.Thu, Week.Fri, Week.Sat, Week.Sun };
  SampleProgram(day);
    }
}

結果:月曜火曜水曜木曜金曜土曜日曜

すごく微妙なサンプルになったと思いました。


■ちなみに整数値の方を使用したいときは、
以下のように型変換すればOKです。
----------------------------
(整数型)列挙型名.メンバー名
----------------------------


■その他こわざ

参考になった応用の例です。
・enumの値を任意の文字列に変換する
・数値がenumで定義済みがどうかチェックする
・enumの値を列挙する
http://qiita.com/hugo-sb/items/38fe86a09e8e0865d471