2015年10月27日火曜日

robots.txtの書き方



こんにちは山田です。
肌寒くなってまいりましたね。10月も、もう終わりです。
秋の味覚の栗を探したい気持ちを抑えつつ、SEO対策の話です。

今回は、クロール最適化の方法の一つとして、robots.txtについてお話しします。
まず、検索エンジンのロボットが、サイトの中で最初にアクセスするファイルがrobots.txtになります。

もし、テストページなどをアップロードしてクローラーにインデックスされたくない場合は
robots.txtで拒否して、インデックスしてお欲しいページに誘導してあげましょう。

さて、以下に書き方についてまとめてみました。ご参考になればと思います。


robots.txtの書き方

■ファイル名
robots.txt

■ファイルの置き場所
ドメインのルートドメイン

■サイト内すべてのロボットを拒否したい場合
User-agent:* 
Disallow:/

■特定のロボット+特定のディレクトリやページ
User-agent: Googlebot ←グーグル
Disallow: /test/    ←拒否したい場合
Allow: /test/act    ←testディレクトリは拒否するが、actページは受け入れる場合
Allow: /test/act.html ←testディレクトリは拒否するが、actページは受け入れる場合

ser-agent: bingbot  ←Being(複数ロボットの場合は改行を入れて。拒否ページを記述する)
Disallow: /test/    

■ついでにsitemap.xml
ここに記述しておくとSitemapを読むようになってくれるので記載しておいたほうが良いです。
書き方は↓

Sitemap: http://www.test.com/sitmap.xml
  

2015年10月26日月曜日

「datepicker」の色々。

こんにちわ、開発者のⅠです。
先日、北海道では雪が降ったそうです。
その他の地域も急に冷え込んできましたが、みなさん体調はいかがでしょうか?

さて、前回の投稿ではお伝えできなかった、「datepicker」の各プロパティについて補足しようと思います。

このプロパティに任意の値 ( と言っても、それぞれ選択肢は限られておりますが…… )を設定することで、希望のデザインにカスタマイズすることが可能です!

例えば、”numberOfMonths” というプロパティでは一度に表示するカレンダーの数を指定できます。

「1」を指定すれば一ヶ月分、「2」を指定すれば二か月分……という感じですね。

まだまだ他にもプロパティは存在しており、

   「changeMonth : true(”月”を変更できる) / false(変更不可)」

  「changeYear : true(”年”を変更できる) / false(変更不可)」

   「firstDay : 0 (週始まりが”日曜日”) / 1 (週始まりが”月曜日”)」

   「yearRange : c-10:c+10 (”現在”を基準に選択できる範囲を指定)」

といったプロパティもあります。

これ以外にも、「これいつ使うの?」という用途が想像できないプロパティも存在します。
気になった方はぜひ調べてみてください!

それでは、今日はここまでです。



2015年10月23日金曜日

サーバーコントロールの属性を書き換える方法

どうも山田です。

ASP.NET環境で開発を行っているシステム屋です。
デザイン側の属性を書き換える方法の覚書です。
意外と便利です。

aspx
 <a href="#" class="btnNegative" runat="server" id="linkToTop">

C#
lintToTop.Attributes.Remove("href");
lintToTop.Attributes.Add("class", "btnDisabledNotGray m20");
lintToTop.Attributes.Clear();

①href属性を削除
②class属性を上書き
③すべての属性を削除

Bloggerでインデックスステータスがずっと0 その1

お疲れ様です。岡田です。

ちょうどひと月前の9月末にブログをBloggerへ移設してきたのですが、標題のとおり、Search Consoleで見れる「インデックスステータス」がずーーーーーーっと0になっているので、気になっていました。
序盤はコンテンツが少ないですし、新しいサイトなので、クローラーが来づらいのかなぁと、勝手な想像を巡らせていたのですが、1か月を過ぎた今もまだ「0」のままなので、いい加減どうにかしないとと思いました。

「ピーーーーーーーーーーーーーー」(心停止状態)


クロールエラーはないか

Search Consoleの左メニューにある「クロール」のところをちゃんと見てみます。

まず先頭の「クロールエラー」。
「サイトエラー」と「URLエラー」の2項目ありますが、どちらの「過去90日間エラーが検出されませんでした」となっているので、大丈夫っぽいですね。

クロールの統計情報を確認

次に、「クロールの統計情報」を見てみます。
「過去90日間のGooglebotの活動」とあるので、グラフに動きがあるということは、クロールできてるっていうことなんでしょう。たぶん。。。
10月7日に3ページ、クロールされてるみたい。その後ぼちぼち


robots.txtを確認

Bloggerでブログを作ると、デフォルトのrobot.txtはこんな風になっているのです。

User-agent: Mediapartners-Google
Disallow:
User-agent: *
Disallow: /search
Allow: /

各項目の意味については、こちら(robots.txtの書き方と効果的な活用法)を見ました。
真ん中よりちょっと下くらいで各項目について説明してもらえました。
(追記:後日山田くんがちょっと書いてくれました robots.txtの書き方)

このブログは、複数人数でいろいろなテーマについて記事を書いていく感じなので、開発チームのみなさんには記事に「ラベル」を付けてもらうようにお願いをしています。
そうすると、ラベルごとに記事の一覧が見れて、便利だな~と思ったわけです。
(そういうワケだからみんなラベル付けてくれ~)

たとえば、Kさんが書いてくれている「リンク切れ」というラベルがついている記事の一覧はhttp://stpsysdev.blogspot.jp/search/label/リンク切れ
というURLで表示できるのですが、このデフォルトのrobot.txtだと、このラベル別の記事ページにはクローラーが入らないようになってしまってるっぽいのです。

なので、これは変えたほうがいいな!と思いまして、こちら(Bloggerのサイトマップとrobots.txtの設定方法)を参考にして、robot.txtをこんな風にしました。

User-agent:* 
Allow: /search/label/
Disallow: /*archive 
Sitemap: http://stpsysdev.blogspot.jp/feeds/posts/default?orderby=UPDATED
これでインデックス数も増えるんじゃないかなぁ。と、期待ですが、どうなんだろう。

サイトマップを確認

いつだったか忘れてしまったのですが、かの心停止がずっと続いているのが気になり始めたころに、サイトマップを追加しました。
なんと、Bloggerにはサイトマップを作成する機能が備わっているので(こちらを参照しました:Bloggerのサイトマップ(sitemap.xml)の自動作成)、それで作成したものを「Search Console」⇒「クロール」⇒「サイトマップ」⇒「サイトマップの追加/テスト」から追加しました。

サイトマップのコンテンツというグラフを見ると、10月12日から送信されているページが増えているので、きっとこの時期にやったのかもしれません。

もしかしたらやらなくても上がってきてたのかもしれませんが、送信できているみたいですし、その後もコンテンツが増えるたびに数字が伸びてるみたいなので、OKってことにし、、、、!!?

ん?ちょっとまって

青が「送信」、赤が「インデックスに登録済み」

「インデックスに登録済み」が25もある!?ど、どういうこと・・・・・・

だって「インデックスステータス」が心停止だから、「インデックスに登録済み」のページが0っていうことなんじゃないの・・・チガウノ・・・・?

ヨクワカリマセン




というようなかたちで、Search Console からクロールについての設定を見直してみたのですが、これで「インデックスステータス」が息を吹き返してくれるといいのですが、、しばらく様子を見てみたいと思います。

なにかお知恵を貸してくださる方!コメントをお願いいたします。

そもそも「インデックスステータス」ってナニモノなのかしら、、、





【後記】
Kさんの見やすい記事を見習って、画像を使ってみたり、htmlをいじいじしてみましたが、なんか変。もうあきらめです。
h2タグの場所が変なのかな?エディタと二刀流だとはちゃめちゃです。
h2要素の個数は検索順位に影響を与えるか?
次回もがんばります。カステラ食べたい。

2015年10月22日木曜日

タイニーPNG のAPIを利用した画像圧縮アプリケーションの作成

こんにちわ山田です。
昨日は、オリオン座流星群がよく見えたそうですね。
まったく見れなかったです、、。

たまたま夕方のニュースで情報を得ていたので、楽しみにしていたら
朝になるまで思い出せませんでした。

そんなこんなで、画像を外部のサービス(API)を利用して
圧縮して、画像サイズを小さくするメソッドを作成したので、その覚書です。

開発環境 ASP.NET
開発言語 C#

使用したのは、TinyPNGでほぼ公式のリファレンス通りに実装しました。 
画像→byte配列にするのが苦戦しました。ここを参考にさせていただきました。 

呼び出し元
    protected void ButtonUpload_Click(object sender, EventArgs e)
    {
        Label1.Text = "";
        if(FileUpload1.HasFile)
        {
            string path = @"C:\temp\\";
            //つけたいファイル名
            string fileName = FileUpload1.PostedFile.FileName;
            string output = Path.Combine (path, fileName);

            //アップロードファイルを入力ストリーム経由でbyte配列に読み込む
            Byte[] aryData = new Byte[FileUpload1.PostedFile.ContentLength];
            FileUpload1.PostedFile.InputStream.Read(aryData, 0, FileUpload1.PostedFile.ContentLength);
            output = SizeDownImage(aryData, output);
            Label1.Text = "次のファイル名で保存しました: " + output;
        }
  
呼び出される側
    /// <summary>
    /// アップされた画像をTinyJPGのAPIを使用して、圧縮して保存するメソッド
    /// ・引数:
    ///  byte[] 画像のバイナリデータ
    ///  string 保存先のファイルパス
    /// ・返り値:
    ///  string 保存後のファイルパス
    ///   ※失敗した場合は、空を返却
    /// </summary>
    /// <param name="_imageByte"></param>
    /// <param name="_output"></param>
    /// <returns></returns>
    public static string SizeDownImage(Byte[] _imageByte, string _output)
    {
        string key = [外部APIキー];

        string url = [外部APIのURL];
        string auth = Convert.ToBase64String(Encoding.UTF8.GetBytes("api:" + key));

        WebClient client = new WebClient();
        client.Headers.Add(HttpRequestHeader.Authorization, "Basic " + auth);
        string result = "";
        try
        {
            //画像アップロード //
            client.UploadData(url, _imageByte);
            // 画像ダウンロード
            client.DownloadFile(client.ResponseHeaders["Location"], _output);
            result = _output;
        }
        catch (WebException ex)
        {
            log.Error(ex.Message);
        }
        finally
        {
            client.Dispose();
        }
        return result;
    }
}