2016年1月28日木曜日

定数の新しい行です エラー

こんにちは山田です。

(ちなみに開発言語:C#の話)

本日もカタカタとプログラミングをしている中 
文字の置き換え(String.Replace)を行おうと思ったら見慣れないエラーが
 

「定数の新しい行です。」

ちょっとわからなくグーグル先生に聞いてみました。
どうやら調べてみると¥の文字に原因があるようでした。
 解決方法としては2パターン見つかりました↓

■解決方法①

 \を直接書かず
System.IO.Path.DirectorySeparatorChar; を使う
tempFileName1.Value.ToString().Replace("/", "System.IO.Path.DirectorySeparatorChar;");
■解決方法②
 "\"の前に@を付ける
tempFileName1Value.ToString().Replace("/", @"\");
■解決方法③

 \\と書く
tempFileName1.Value.ToString().Replace("/", "\\");
結局は方法②を取りました。

【Android】AppIndexingを実装してみた

こんにちは。エンジニアのKです。
アプリへの新しい導線口だけでなく、SEOにも効果があると言われているAppIndexingを
遅ればせながら実装してみました。

AppIndexingについて

ざっくり言うと、Google検索結果にアプリコンテンツへのリンクが表示されるようになります。
Cookpadさんの場合、こんな感じで表示されます。


アプリがインストールされていれば、アプリ内のコンテンツ(この場合「大根」レシピの検索結果画面)が、まるでwebページへの遷移のようにシームレスに行われます。
アプリがインストールされていない場合、Google Playストアのダウンロードページヘ遷移します。便利ですね。

アプリリンクの表示条件は?

実装にあたって、どんな挙動になるか、先駆者様のアプリで見てみようと思ったのですが、
なかなか上手く行かずに苦労しました。
AndroidはGoogleアカウントでログインしていなくても表示されるらしいのですが、なかなか表示されず。。
とりあえず、対象アプリをインストールしたGoogleカウントでログインしたら、表示されるようになりました。
※ Androidバージョンやブラウザアプリのバージョンにもよる違いもあるかもです。


AppIndexingを実装する

公式ドキュメントに従って実装していきますが、試行錯誤した点について補足していければと思います。
 サンプルコードは、公式ドキュメントにも出てくるandroid-deep-linkingプロジェクト(com.recipe-app)を使います。

 

インテントフィルタの追加

まず、アプリ内のコンテンツに直接遷移できるディープリンクをサポートする必要があります。
http://recipe-app.com/recipe/{recipeId}といったwebページでレシピ詳細を表示する機能があった場合、
同等の機能を持ったアプリのActivity(.RecipeActivity)に、以下の様なintent-filterを追加します。(AndroidManifest.xml)
        
            
                
                
                
                
                
            
            
                
                
                
                
                
            
        

HTTPスキームとカスタムスキームどちらかだけでもいいですし、両方設定してももちろん大丈夫です。
要は特定のURLでインテントが飛んだ時に、アプリが反応できるようになっていれば良いということですね。
Googleは実装手順が簡素になるということから、HTTPスキームを推奨しています。

ディープリンクのURIに対応する処理をActivityに実装

 intent-filterを追加したことにより、http://recipe-app.com/recipe/pierogi-poutineといったURLで.RecipeActivityが起動するようになります。
.RecipeActivityはレシピ詳細を表示するアクティビティですので、対象となるレシピIDが必要になります。
アプリ内遷移であれば、前画面から飛ばすintentにputExtraしてレシピIDを渡すのが一般的かと思いますが、
ディープリンクの場合、intent.getDataString()で取得できるURLをパースして、レシピIDを取り出して、後続の処理に渡すようにします。

    protected void onNewIntent(Intent intent) {
        String action = intent.getAction();
        String data = intent.getDataString(); // http://recipe-app.com/recipe/pierogi-poutine
        if (Intent.ACTION_VIEW.equals(action) && data != null) {
            String recipeId = data.substring(data.lastIndexOf("/") + 1); // pierogi-poutine
            // レシピ情報を取得して、表示する処理
            Uri contentUri = RecipeContentProvider.CONTENT_URI.buildUpon().appendPath(recipeId).build();
            showRecipe(contentUri);
        }
    }


ディープリンクをGoogleに知らせる

ここまでで、アプリがディープリンクに対応し、Googleの検索結果から直接アプリへ遷移できるようになりました。
あとは、対応したディープリンクをGoogleに教えて、検索結果に表示するようにしてもらいましょう。
教える方法は、
  1. AppIndexing APIをアプリに実装
  2. 対応するwebページのmetaタグにディープリンクを指定
  3. sitemap.xmlに記述する
があります。2,3はアプリに対応するwebページを持っている前提となります。
できれば全て対応したほうが、インデックスされやすくなりそうですね。

また、Googleにディープリンクを知らせる際のURLは、以下の様なフォーマットで記述します。
android-app://{package_id}/{scheme}/{path}
上記で対応したディープリンクの場合、
android-app://com.recipe-app/http/recipe/pierogi-poutine
android-app://com.recipe-app/recupe-app/recipe/pierogi-poutine
となります。

AppIndexing APIで知らせる

公式ドキュメントにあるとおり、build.gradleとAndroidManifest.xmlに設定を追加し、ActivityのonStart(), onStop()でAPIを実行します。
公式ドキュメントにあるコードでは、タイトルとwebのURL、アプリのURLを設定していますが、
以下のように書くと、概要(description) も合わせて送信できるようになります。
※descriptionがどのように評価され、利用されるかは不明

    mClient.connect();

    String title = "タイトル";
    String description = "概要";
    Thing object = new Thing.Builder()
        .setType("http://schema.org/Thing")
        .setName(title)
        .setDescription(description)
        .setUrl(APP_URL)
        .setId(WEB_URL)
        .build();
    Action viewAction = new Action.Builder(Action.TYPE_VIEW).setObject(object).build();
    AppIndex.AppIndexApi.start(mClient, viewAction);

タイトルや概要にマルチバイト文字が含まれる場合、URLエンコードする必要は無いのかな?と迷いましたが、エンコードは不要でした。
公式ドキュメントのApp Indexing API 呼び出しをテストするで見た時、コンソールに文字化けして表示されますが、
リリース後にSearch ConsoleでFetch as Googleで見たところ、正常に日本語が認識されていました。


Webページのmetaタグで知らせる

http://recipe-app.com/recipe/pierogi-poutineのheadタグ内に、以下のmetaタグを追加します。

<html>
<head>
...


...
</head>
...
</html>

sitemap.xmlで知らせる

http://recipe-app.com/recipe/pierogi-poutineの要素にlink要素を追加します。
...

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

...


以上で実装編は完了です(長い)。
次回はGooglePlay DeveloperConsoleやSearchConsoleで必要となる設定についてまとめられたらと思います。

まとめました => 【Android】AppIndexingを設定してみた




2016年1月27日水曜日

GoogleのAMP(Accelerated Mobile Pages)ってすごいの?

AMP(Accelerated Mobile Pages)とは・・・


Z-MENです。
どうも。

昨年夏頃?からモバイルやSEO界隈でAMPの話題がすごく盛り上がっていて、
モバイル担当としてもやはり気になるところなので一度情報を整理してみたいと思います。

自分の勉強がてらではありますが、どなたかの参考になれば幸いです。
AMPとは、からAMPの実装・確認までまとめてみます。

AMP(Accelerated Mobile Pages)とは?

AMPはAccelerated Mobile Pagesの略称です。
GoogleとTwitterが共同で立ち上げたAMPプロジェクトのオープンソースらしいです。
簡単に言うとAMPに対応した記事コンテンツをGoogle側が勝手に読み取り、キャッシュして、
超高速に優先表示してくれます。モバイルの場合のみ出てくるようですが、カルーセル形式でずらっと並べてくれます。

去年末くらいからモバイルで検索した際に、一部記事がカルーセルで表示されるようになりましたが、あんな感じのイメージで、表示が超高速になる、という感じです。

【g.co/ampdemo】でAMPをデモ体験

Googleさん、ちゃんとデモも用意してくれていて、Googleの検索窓に『gco/ampdemo』といれると
AMPのデモ表示モードに切り替わります。ほんと爆速です。


 AMPの実装について

AMPの実装方法を見てみましょう。
GitHubにもあるんですが、全部英語でオエッとなるかたは参考になれば。

AMPは専用のjsライブラリとbilerplate(いけてるテンプレみたいの)で動くとのこと。
超シンプルに書くとこんな感じになりますと。

  
    Hello, AMPs
    
    
    
    
    
  
  
    

Welcome to the mobile web

 

マークアップ上の注意点としては、

    • <html>タグを<html amp>と書く?
    • <head> 内に<style>body {opacity: 0}</style><noscript><style>body {opacity: 1}</style></noscript>をいれる
    • <head>閉じ直前にを<script async src="https://cdn.ampproject.org/v0.js"></script>をいれる
    • 画像を入れるときはこんな感じ<amp-img src="welcome.jpg" alt="Welcome" height="400" width="800"></amp-img>
    とかとか、基本はこんな感じなのですが、普通にHTMLでページ作ればOKというわけでもなさそうです。
    公式のGetStartにいくつか注意事項があるので貼っておきます。
    AMPプロジェクト公式
    AMP GitHub

    日本語版の導入ガイドも発表されたようです。
    AMP日本語版導入ガイド

     AMPの条件・制約 

    AMPには、爆速を得られる代わりにいくつか制約があります。
    この制約がやや影響が大きく、導入できない方も多いかもしれません。

    1. AMPのランタイムはAMPのCDNから固定のURLで配信
    2. Javascriptが使えない(JSON-LDのみ)
    3. 画像・動画は大きさの固定指定が必要
    4. 広告はiframe経由で表示
    5. フォーマットを遵守
    6.  link要素はrel:canonical以外禁止
    7. ほかimgとかformとかinputタグも使えないかも
    とのこと。これ特に②がでかい、トラッキングができない・・・。
    『AMP実装したから効果が楽しみだぜー!』と思っても効果の程がわからない・・・
    そしてどうもレスポンシブにもうまく対応してない模様。。。厳密にはレスポンシブの実装方法による、ということででしょうか。ちゃんとCSSとかでdevicewidthで判別してればいいんでしょうが、jsでUserAgentみて~とかやってるとアウトなんでしょうね。
    レスポンシブを推奨しておきながらレスポンシブでは使えないかもってどうなのよ。
    そしてとどめの⑥⑦・・・まじか。
    とにかく新しいものやっとけ!と飛びつかずにGoogleが修正やら本腰入れた公表をするまでは
    いったんステイが間違いないかも、が現時点でのわたしの見解です。


    2016.02.03追記
     広告とGAについては対応されることが発表されたようですね。
     まずは最低限の機能は揃えてくれた、というかんじでしょうか。他のアクセス解析が
     使えないのは相変わらず痛いんですが・・・。
    AMPが広告とGoogleアナリティクスをサポート開始

     AMPの確認方法

    先日SearchConsoleでAMPが確認できるようになりました、とアナウンスがありました。
    とりあえず実装してみた!というかたはいてみましょう。
    公開しなきゃわからんよ、ってことね・・・。
    Googleウェブマスターブログ:Search Console における AMP エラー レポートのプレビュー 

     終わりに

    GoogleのAMPの説明を直接聞いたり様々な記事に目を通したりしてきましたが、所感として、モバイルフレンドリーの基準として表示スピードがいよいよ本格導入されるか?な話もあり、AMPを通してモバイルでの表示スピードに対するGoogleの本気度みたいなものは感じました。





    アプリのプロトタイピングツールを使い倒してみる① -プロトタイピングとはー

    こんばんは、おかだです。



    昨年の話になってしまうのですが、Googleさん主催の「Google for Mobile」というイベントに参加してまいりました。

    イベントでは、スマホに限らずさまざまなモバイル端末周辺にまつわる最近のお話を
    たくさんのスピーカーの方から聞けるセッションがたくさん設けられていて

    中でもウェアラブル端末や仮想現実のお話が非常に興味深かったです。

    個人的には購入したばかりだったChrome Castが、スタイリッシュにアップグレードして
    発売されるというお話がショックでした。
    うちのテレビ、HDMI端子を画面に垂直に差し込むタイプなので、以前のCastちゃんでは
    壁方向に端末のお尻が突出してしまうので、接触とか壁との隙間とかが結構気になっていたんですよね。

    しかたないので、気が向いたら新しいCastちゃんを購入しようかと思います。

    Chrome Cast、持ってると本当に便利でたのしいので、オススメです!



    あたらしいアプリをつくることになりました


    Google For Mobile では、アプリ開発に関するお話もたくさん聞けました。

    音楽がきけるアプリ「AWA」のデザイナーさんの、実際にAWAを作った時のお話もとても参考になったので、こんどあたらしいアプリを作る時にぜひ意識していきたいと思いました。


    なんですが今日書きたいのはその話ではなくて、プロトタイピングツールのおはなしです。


    プロトタイピングとは


    プロトタイピングは、アプリの設計段階で画面のイメージや動きを実装する前にみんなで共有するための素敵な手段です。

    WEBのデザインと違って、アプリの場合は見た目だけではなく
    アニメーションの動きなども伴ったユーザー体験が大事になってくるので
    そのへんのいろいろを含め、作ってしまう前にみんなで共有したいよね!ということです。

    "動き付きのモック"っていうイメージでしょうか。。



    最近は簡単にプロトタイプをつくれる便利なツールがあるらしい


    プロトタイピングについていろいろ調べると、けっこう書いてあります。

    「あまり時間をかけないことが大事」



    あくまでイメージの共有手段でしかないので、そこに時間かけるのは本題じゃないよね、ということでしょう。


    なので、世の中のやさしい人たちが作ってくれた「プロトタイピングツール」をつかって
    新しいアプリのプロトタイプを作ってみようと思います!


    ツールには、無料のものから有料なものまで、お手軽なものから本格的なものまで
    海外のものをあわせると10サービスくらい有名なものがあるみたいですが

    今回は「Pixate」というツールを使って、いろいろ試してみたいと思います!




    、、、というのは、「Pixate」のお話が冒頭のイベントで紹介されていたからなのです
    (残念ながらそのセッションは私は聞いていなかったのですが、、、、汗)



    プロトタイプが会議で役に立つといいなぁ。




    ちなみにおかだはアプリの開発者ではないので、わからないこともありそうで結構ドキドキしています。

    次回インストールから始めてみたいと思います!




    わくわく!


    【2016/02/05 追記】
    コメントでもご要望をいただいたのですが、数あるプロトタイピングツールをいろいろとご紹介するのも
    おもしろいかも!ということで
    次回からは「実際に使ってみた」シリーズを何回か連載したいと思います!

    早速ですが次回は「POP」と「InVision」の2つをご紹介していきます~~~

    2016年1月25日月曜日

    MARSとは?

    こんにちは山田です。
    SQLのクエリを見ている時にわからない単語があったので調査しました。
    その備忘録になります。

    ■ちなみに私の開発環境
    ASP.NET:2.0
    SQL Server:2005

    ■MARSとは?

    さて、さっそくMSDNに記述がありホットしました。
    Multiple Active Result Sets(MARS)

    SQL Server 2005から搭載された機能で、
    複数のアクティブな結果セットが得られる機能だそうです。
    つまり、1回のコネクションで複数のデータベース・コマンドを同時に照会できるようにするものです。

    MSDNのサンプルコード↓このようになっているみたいです。
    string connectionString =
      "Data Source=MSSQL1;" +
        "Initial Catalog=AdventureWorks;Integrated Security=SSPI;" +
        "MultipleActiveResultSets=True";
    
    初期値ではfalseになっているので、MultipleActiveResultSetsをtrueにする必要があります。

    DBの接続系はよくわかっておらず、誰かが作った接続メソッドを流用しているので
    いつかは書けるようになりたいなと思いました。

    ADO.NET 2.0の注目機能【SQL Server 2005との連携編】

    つまり2005以前は、クエリ文別に、毎回接続しなおしていたんですね。
    大変そうです。


    ■CRUDとは?

    CRUD(クラッド)とは、
    Create(生成)、Read(読み取り)、Update(更新)、Delete(削除)
    データベースのアクセスで
    ユーザーインターフェースに備えるべき4つの基本機能(情報の参照/検索/更新)を指す用語でしあ。
    Create,Regist,Update,Dropとも言います


    ■Management Studio を使った SQL Server の操作で カラムにNULLを挿入する小技
    マネジメントスタジオでカラムを選択して
    Ctrl+0
    を押します。
    わからなくてググったのでここに貼り付けておきます。