jqueryでdocument.getElementById()と同じエレメントを取得するには

jqueryでdocument.getElementById()と同じエレメントを取得するには

久々にjqueryを触ってます。
canvasの処理をする時に

いつもは下のようなコーディングをしてるのですが、

var cEle = document.getElementById('canvas1');
var cCtx = cEle.getContext('2d');

それを

var cEle = $("#canvas1");
var cCtx = cEle.getContext('2d');

と記述して、2行目で落ちてました。
これだと、canvus1のjqueryのObjectを取得しているために、getContextできなくて落ちちゃうんでしょうね。
それで、Elementを取得するようにするために、.get()か[]でElementの配列へアクセスします。

var cEle = $("#canvas1").get(0);
var cCtx = cEle.getContext('2d');

とするか、

var cEle = $("#canvas1")[0];
var cCtx = cEle.getContext('2d');

とするか、

var cEle = $("#canvas1");
var cCtx = cEle[0].getContext('2d');

これでエレメントが取得できます。

以上、jqueryでエレメントを取得するでした。

新しいスマホへデータ移行

新しいスマホへデータ移動 画像android スマホを 新しいスマホへデータ移行 することになりました。
新しいと言っても色違いのスマホへ交換するだけなんですけどね。。それでも新しいスマホへ旧スマホのアプリやデータを移動させる必要が出来ました。

 

新しいスマホへデータ移行

データバックアップの状態確認

最初にデータがGoogleのデータバックアップがONになってるか確認しました。
ついでに同期もちゃんと出来てるか確認
データのバックアップ確認画像データ同期の確認

次にデータを移す方のスマホを初期化しました
データの初期化実行画像初期化中画像

立ち上がるのを待って、セットアップします。

「タップ&ゴー」

途中で「タップ&ゴー」画面が立ち上がります。
(スナップショット取れました。後で貼り付けます)
タップアンドゴー画面

端末をセットアップする際にタップ&ゴーを利用すると、現在の Android 搭載端末から新しい Android 搭載端末に、すべての Google アカウント、バックアップ済みのアプリ、データをすばやくコピーすることができます。

条件として、新しい端末が Android 5.0 以降を搭載していることと、現在の端末が Android 4.0 以降を搭載していて NFC を有効にしていることが必要です。

NFCで端末同士の確認が行われます。(事前にNFCのONが必要)
現在の端末の画面に「この端末からアカウントとデータをコピーしますか?」というメッセージが表示されたら、[OK] をタップします。この処理には Bluetooth が使用されます。

復元?が開始されます。
タッチアンドゴー復元画面

データ移行確認

設定が完了すると、すべての Google アカウントのデータと関連付けられているアプリが新しい端末で利用できるようになります。

どんどんアプリがインストールされている状況
どんどんアプリが入っていく画像
アプリがダウンロードされている状況がわかります。

Google Play開発者サービスなどは、ユーザの許可が必要みたいなので、許可してやります

インストールされる前は、白っぽい感(山旅ロガー)じで、インストールされると普通のアイコンに(地図ロイド)

でも、全部が更新とかされるわけではなさそうなので、後からちゃんと更新とかしてあげる必要も有りそう。

後、セキュリティソフトのアバスト(avast)を入れてたのですが、入っていません。
起動されてないだけかな?
Google Playのインストール済のところにアバストちゃんとインストール済、最新って出てました。
起動したらちゃんと動き出しました。

電話のアドレス帳もちゃんと入ってました。
Lineはやって無いのですが、多分Lineアカウントは引き継げないと思いますので、手でやってあげる必要があると思います。でも、メールアドレスとパスワードがわかってたら、問題なく移行できますし。手間もそんなにかからないですよね。

さすがに時計のアラーム設定とかはデータ移動されてませんでした^^;
寝坊しないように再セットをお忘れなく。

山旅ロガーのデータ移行もできてなかった。。。
まぁ、仕方ないですよね。

感想

ローカルに有る写真とかはどうなのかな?
どこまでがBluetooth 経由でコピーしてくれるのか、わかりません。
ローカルでいろいろ保存している人はその辺りは要注意かもです。

私の場合写真も含めネットワーク上に保存出来るものはネットワークに保存しているので、最初のセットアップ以外はほぼ何もせず移行できました。
アプリのデータは、面倒なので諦めました。。。

画面のアイコンの配置も全くそのままで、以前に比べると楽に移動できますね。

 

 

ステータス: トラッキングがインストールされていません

Google アナリティクスのトラッキングコードを張り付けても上手く認識されていない状況の報告です。約24時間経過しましたが「ステータス: トラッキングがインストールされていません」と出たままです。
レポート>ユーザー>サマリー画面でも全くデータが入っていませんが2日間くらい反映が遅くなるんでしたよね?ここを見ても当てにならないですよね。

結果を先にお話ししておくと、設置してから48時間後くらいに正常にトラッキングコードが認識され受信するようになりました。
途中TagManager経由で試すなどしてみましたが、結果は同じでした。ちゃんとトラッキングコードが設定できてるなら、放置しておいても大丈夫のようです。

ということで、同じような人がそのうち現れた時の参考までに、経過状況を書き連ねます。

トラッキングコード張付けについて

トラッキングコードheadタグの一番下に張り付けました。
張付け方は以前にも数回行ったことが有るので間違いないと思います。
また、Webサイト(ブログサイト)を表示して目視でもトラッキングコードを確認しています。

その後2時間程度放置後

すぐには反映されない?ことも有るのかもと考え2時間程度放置しました。
それでも、やはりダメでした。
そこでどこからもアクセスが無いので 「データを受信しています」とならないのかも、、、と考え、スマホのWifiを切ってドコモに繋いで表示して見ることに。
ダメでした。
レポート>リアルタイム>サマリーにも反応なし。ここはリアルタイムでデータが入ると思うのですが、ダメでした。

 「データを受信しています」にならず、「トラッキングがインストールされていません」のままです。

ググって情報収集してみる

「トラッキングがインストールされていません」でググってみましたが、特に有効な情報は得られませんでした。
ただ単に張り付けるだけなので、そんなに難しくないですもんね。当然と言えば当然かと。。。

プロパティを作り替えると上手く行くとの報告が有ったので、試してみましたがダメでした。
目視でトラッキングコードを確認しましたが、インストールされていないと出ます。
同じWebサイト(ブログサイト)に2つのトラッキングコードが付いてしまいました。

タグマネージャーを利用してみる

仕方なくタグマネージャー(Tag Manager)なるものを使用してみることにしました。タグマネージャって良く分からないんですよね。
間違って認識しているかもしれないんですが、タグマネージャのタグを張り付ければ、他のタグは張らなくて良くて、例えばアナリティクスのタグをタグマネージャーで認識させてやればそれでOKなんだろ。。。と言うもの?

それから、マウスの動きを捉えれるので、ちゃんと設定すればいろな情報が貰える仕組みを持ってる。。。のかな?

で、とりあえずアカウントを作って設定して、後から追加したアナリティクスのトラッキングIDを設定して、プレビュー・デバッグでアナリティクスのタグがどうなってるか確認しました。
タグマネージャーでプレビューで確認

ユニバーサル アナリティクスが「Tags Fired On This Page」に出てますよね?
クリックして中身を更に確認
タグマネージャーで中身を確認する
ちゃんと設定したUniversal Analyticsが表示されています。

その後12時間程度放置後(最初の設置から26時間くらい)

状況は変わりません。
タグマネージャーで設定してもアナリティクスのトラッキングコードは変わらないのかな?
そう考えると、今しばらく待ってみるしか無いですね。

一応、レポート>リアルタイム>サマリーでチェックしてみることに。
最初に作成したプロパティに反応有りました!!
タグマネージャー経由はやり方が違っているのか、反応なし・・・

しかし、反応の有ったプロパティのトラッキングのステータスは「ステータス: トラッキングがインストールされていません」のままです。
ステータス: トラッキングがインストールされていません
最終確認日が太平洋夏時間(PDT)で出てますね。16時間差でしたっけ?
22:12+16=1日 14:12
だいたい合ってます。つい先ほどレポート>リアルタイム>サマリーで反応が有ったのにダメってことですね。
実に厄介な表示ですね。

更に11時間くらい経過

現在の状況です。
TagManager04
ステータスは「ステータス: トラッキングがインストールされていません」のままです。

しかし、レポート>ユーザー>サマリーにデータが入ってきてます。これってウェブマスターツールのデータが入ってきてるだけじゃないですよね?
実際はトラッキング情報が入ってきてるけど、ステータスだけがダメってことなのかな?

設置48時間後くらい

現在の状況です。TagManager06
正常になった模様です。
ステータス役割がいい加減だったってことでしょうか?
とりあえず、これで調査終了です。

今回はGoogle アナリティクスの「ステータス: トラッキングがインストールされていません」が気になって定期的に確認しに行ってみました。
今までの経験では直ぐにステータスは反映していたのですが、今回は時間が掛かりました。
このようなケースも有るのですね。勉強になりました。

 

カテゴリー: SEO

[JAVASCRIPT] PDFをWebブラウザに簡単に表示する方法2

PDFをWebブラウザに簡単に表示する備忘録です。
先回は単体で表示させていましたが、今度は切り替えて表示が出来るようにしました。

テキストファイルでPDFのURLリストを事前に作成しておきます。
そのテキストファイルを読込み、selectに格納します。
selectでPDFを選択することでPDFを表示します。
タイマー機能を付けてPDFを表示すれば、工夫次第でスライドをめくるように進めることもできます。

ちなみに、jqueryを使いましたので先回と少し文法等が異なります。

それからobjectを利用したのでIEでしか動きません。embedに切り替えればChromeでも動きますので適宜切り替えて使ってください。

<html>
<head>
  <title>test</title>
  <script src="./jquery.min.js"></script>
  <script>
    $(document).ready(function () {
      var i=0;

      $("#Select1").change(function () {
        pdfChange();
      });

      $("#files").change(function () {
        if (window.File) {
          // File APIが実装のブラウザ
          var fileList = document.getElementById("files").files;
          var reader = new FileReader();
          reader.onload = function () {
            // ファイル読み込み完了時
            var term = reader.result.split('\n');
            $.each(term, function (index, elem) {
              $("#Select1").append($('<option>').html(elem).val(elem));
            });

            //初回のPDF更新
            pdfChange();
          }
          // ファイルの読込み
          reader.readAsText(fileList[0], "utf-8");
        }
        else {
          // File APIが未実装のブラウザ
          $("#list").html("File APIが未実装のブラウザ");
        }
      });

      //PDF表示切替
      function pdfChange() {
        if (i > 0) {
          $("#div_PDF").empty();
        }
        i += 1;

        //OBJECTタグを作成
        var tid = 'objPdf' + jQuery.now().toString();
        var obj = document.createElement('object');
        obj.setAttribute('id', tid);
        obj.setAttribute('classid', 'clsid:CA8A9780-280D-11CF-A24D-444553540000'); // PDFのクラスID(固定値)
        obj.setAttribute('style', 'width:500px; height:700px;');

        //PDFのソースを設定
        var param = document.createElement('param');
        param.setAttribute('name', 'src');
        param.setAttribute('value', $("#Select1").val());
        obj.appendChild(param);

        //作成したOBJECTタグをDIVタグの中にセット
        $("<div id='pdfDiv" + i + "'></div>").appendTo($("#div_PDF"));
        var div = document.getElementById('pdfDiv' + i);
        div.appendChild(obj);
      }

    });

  </script>
</head>
<body>
  <form id="form1">
    <div>
      <input type="file" id="files" name="files[]" multiple /><br />
      ▼読込んだファイル(テキストファイル)を表示する<br />
      <select id="Select1">
      </select>
    </div>
    <div id="div_PDF" style="width:500px; height:700px; background:#ccc"></div>
  </form>
</body>
</html>

SEO パーソナライズド検索

Googleの検索ってどの程度のバイアス?フィルター?がかかってるんだろう・・・って思うことないですか?
そう、所謂パーソナライズド検索ってやつのことです。
SEOをやってる人は、多分自分のサイトを検索する時にパーソナライズド検索にならないように注意してると思います。
一般の人には自分の好みに合わせて検索してくれるので概ね結果は良い方向に出るので便利な機能だと思いますが。。。

パーソナライズド検索とは

まだSEOを初めて間もない人の為に、
Googleパーソナル検索とは、過去の検索履歴、場所などを検索の条件に加味して個人の興味があるだろうを検索する検索の事です。
例えば「ゴルフ」。同じ発音で意味の違う言葉として良く例に出されて説明られています。
友達から「ゴルフどう?」って聞かれたら、スポーツのゴルフのことか、車のゴルフのことか、あなたなら予想が付きますよね?それと同じことでGoogle検索でも、検索者の過去の検索履歴によってスポーツが車のどちらを優先させるか決めています。

実際にGoogleがどのような基準でパーソナライズ検索を実施しているか私には知ることができませんが、地理的情報・過去の検索結果・ソーシャルな繋がりなどが関与しているのではと考えています。

パーソナライズド検索を無効にするには

私も詳しくないので良く言われている方法を2つ紹介しておきます。
ただし、全くパーソナライズされないかは不明です。少なくも地理的情報は取られているので、その辺りはわかりません。

ブラウザの閲覧履歴を残さないモードにする

あっ、私はブラウザを基本的にChromeとIEしか使わないので、他のブラウザの事はわかりません。あしからず。。。

Chromeの場合「シークレット モード」にします。具体的に、「三本腺メニュー」>「シークレット ウィンドウを開く」をクリックして新しいウィンドウを開けば、シークレット モードになります。
IEの場合「InPrivate ブラウズ」にします。具体的には「歯車メニュー」>「セーフティ」>「InPrivate ブラウズ」をクリックして、新しいウィンドウを開けば、シークレット モードになります。
各々ショートカット キーも有るので、物覚えの良い人は覚えると良いです。

Google Chrome
Macの場合 command+sift+N
Windowsの場合 control+sift+N

Internet Explorer
Macの場合 command+sift+P
Windowsの場合 control+sift+P

URLの後ろに「&pws=0

検索結果の後ろに「&pws=0」を付ける。
実はやり方が良く分かりません。はっきりとしたやり方が書いてあるページは有るのですが、他のページは検索に「&pws=0」を付けろと書いてあるだけなので。。。

で、いろいろ試した結果、一度検索し検索結果が出た後に「&pws=0」を付けます。
https://www.google.co.jp/webhp?sourceid=chrome-ins・・・・・・・・・&pws=0

後、この方法の派生タイプですが、「検索エンジンの編集」で「&pws=0」付きの検索エンジンを登録する方法も有りますが、普段使いには不便なので、方法も有ると言う程度で。

パーソナライズ検索はこれからもどんどん進化して行くだろうと思われます。正確な状態を把握するためにも、バイアス?フィルター?の掛かっていない状態で検索しないとダメですね。
でも、便利な機能ですね。パーソナライズ検索って。

WordPress テーマ Twenty Tenの更新が失敗

WordPressのテーマ「Twenty Ten」の更新が失敗してしまったので、その対応を残しておこうかと。
WordPressを立ち上げたら更新の案内が来ていました(前から来てたですが)。そこで一応使っていないテーマだけど更新をしておこうかなっと思って、更新をしたとこを、失敗してしまいました。
実際は原因は大したことでなく、アクセス権の問題でした。

Twenty Tenの更新が失敗

まずは、更新失敗のアナウンス画面です。
テーマ更新失敗メッセージ画面
途中までは正常に処理できているみたいで、旧バージョンのテーマの削除で失敗しています。
そこで、テーマの格納フォルダのアクセス権を与えてみることにしました。

テーマの格納フォルダのアクセス権を付与画面です。
アクセス権付与画面
元々、アクセス権は読み込みと変更のチェックがONされているので、フォルダにはアクセス権が有るようでした。中のフォルダもしくはファイルに変更のアクセス権が無かったのかもしれません。
左下の「すべての子オブジェクトのアクセス権を置換する」もチェックを入れてアクセス権の設定を実施しました。
ちなみに、フォルダの場所は「\wp-content\themes\twentyten」です。

更新を再実行してみました。
テーマが正常に更新できた画面
無事に成功しました。

このWordPressはレンタルサーバの簡単インストールでインストールしてあります。WordPressのバージョンアップの時もアクセス権絡みで更新が失敗していました。レンタルサーバ任せだと、いろいろなところでちょっとした障害が出てしまうものなのですね。
今回は簡単に済んでめでたしめでたし。

[SQL Server] nvarchar と varchar

nvarchar と varchar の使い分けしていますか?
もしくは、nchar と char の使い分けしていますか?

nchar および nvarchar は Unicode 文字列データを扱う UNICODE UCS-2 文字セットを使用する文字データ型です。
char および varchar は Unicode ではない固定長の文字列データを扱う文字データ型です。

nvarcharとvarcharの違い

上の説明だとわかったような、わからないような気がしますか?

ざっくり言うと nvarchar と varchar の違いは Unicode か Shift_JIS かっていうことですよね。全角2バイト、半角1バイトとかって言う古い概念が varchar で、文字は文字数だけっていうのが nvarchar で、その辺りの違いとも言えます。

特殊な環境で稼働させている場合を除いて、SQL Serverを使っている人は、おおよそOSにWindowsを使っていると思います。Windows自体は現在はJIS X 203(JIS2004)を使っていますが、その土台を支えるFrameworkはUnicode UTF-16 (Unicode Transformation Format、16 ビット エンコーディング形式) を使用しています。
どちらが親和性が高いかと言えば、Unicode かな、、、実際はどっちなんでしょうね?
nvarchar と varchar の変換は内部で自動で行ってくれるので、プログラマ的にはバイナリ―で比較するとかしない限りは無視しても問題ないレベルだと思うし。でも型を曖昧にした変なプログラムを書いちゃダメですけどね。。。

nvarchar と varcharどちらを使う?

じゃ、実際データベースの設計をする時どちらを使う?ってなると、悩むというか、どちらでも良いというか。。。
私はとりあえず最近の設計は全て nvarchar にしてます。文字数を数える時に全角2バイトとか半角1バイトって変換しなくて済むし。
でも、限られたスペースでギリギリに表示を考えている場合は半角なら何文字とか数える人が居ますよね?そういう人が設計に入ってくると文字数を数えて表示幅がどんだけだから。。。ってプログラムで分岐しますよね。そういう人が居るなら数えるのが便利な varcharかな。。。

歯切れがとても悪いのですが、結論はなんとなくnchar、nvarchar、ntextのUnicodeが扱える方が良いかな〜程度です。
明確な理由が無ければそうすると思います。
皆さんはどのように分けて使ってますか?

ウェブサイトをモバイルに最適化する

Mobile-Friendly WebsitesというGoogleのWebサイトを見つけました。。。って今頃かよ〜
一通り目を通してみたのですが、フムフム、フムフム?って参考になるような、ならないような。。。
知らないことも有ったので一読は有効かと思います。
興味が有れば覗いてください。

Mobile-Friendly Websites

その中で最近良くお世話になるのが、モバイル フレンドリー テストです。
以前、「スマホ対応」ラベルをWebサイトに付けたいときにはじめて利用しました。
最近は既存のWebサイトのテストやチェックに使っています。

その他にもモバイル ユーザー向けにサイトを最適化するためのさまざまな情報が載っています。例えば、

米国では、スマートフォン所有者の 94% がローカル情報をスマートフォンで検索しています。 モバイル検索の 77% は自宅や職場で行われています。パソコンがある可能性が高いこれらの場所でモバイル検索が行われているのは興味深いことです。
お気に入りのスポーツチームに関するブログの作成、劇場のウェブサイトの運営、顧客への商品の販売など、ビジネスの種類を問わずにモバイルは重要となっており、今後もその重要性は変わらないと考えられます。ユーザーがモバイル端末からサイトにアクセスする場合に、優れたエクスペリエンスを確実に提供できるようにする必要があります。

私も近くにPCが有ってもちょっとした検索ならスマホで行っています。だからなんとなく上のことも理解できます。

私は新しく作るWebサイトはレスポンシブ デザインを取り入れています。多少面倒なところとか上手く行かないところも有りますが、スキル高めていき対応していきたいと考えています。

 

カテゴリー: SEO

【SQL Server】カーソル CURSOR

今回はカーソルについてです。
基本的にデータベースのデータ操作を行う際はメモリIO、ディスクIOを抑えるため一括して行う方が効率良くデータ処理ができます。しかしながら、一括でデータ操作ができないケースも出てきます。
そんな時に活躍するのがカーソル(CURSOR)です。

カーソル CURSORとは

詳細な説明はSQL Serverのドキュメントで見て欲しいのですが、カーソル(CURSOR)はselectで抽出したデータに対して一行づつ取り出すことができる逐次処理ができる仕組み・機能です。
一行づつ取り出しができるので、その行に対して処理を書けることができます。一括で処置ができない、または一括では処理が重たくてレスポンスが悪くなるなどのケースに使用します。
カーソル CURSORの使い方

カーソル(CURSOR)の使い方は難しくありません。カーソル(CURSOR)のネストもできます。ただし、もともと複雑なことを対象に処理を行うことを考えるとトランザクション設計などはきちんとしないといけませんが。。。

カーソル(CURSOR)を使うには、カーソルの宣言を行います。カーソルの宣言にはデータを抽出するSQLも合わせて示すことになります。
また、抽出した際に抽出データを入れる変数も予め宣言しておかなくてはいけません。
その後、カーソル(CURSOR)をOPENして、データが無くなる(Fetchが失敗する)までループさせ一行づつ処理を行います。
データが無くなる(強制的にループを終了させる)った後は、カーソル(CURSOR)をCLOSEして、カーソル(CURSOR)をDEALLOCATEして終わりです。

DEALLOCATEを使ったSQL例

行っていることは、

  • 変数テーブルを作成
  • 適当にデータを入れる
  • 比較する為にテーブル内のデータ抽出表示
  • 抽出用の変数を宣言
  • カーソル(CURSOR)を宣言
  • カーソル(CURSOR)のOPEN
  • Fetch(一行取り出す)
  • while文でFetchが失敗してないか評価
  • Fetchできていたら、その行のポイントを前の行のポイントを加算して更新Fetch(一行取り出す)
  • Fetch(一行取り出す)・・・ループ
  • カーソル(CURSOR)をCLOSE
  • カーソル(CURSOR)をDEALLOCATE
  • 比較する為にテーブル内のデータ抽出表示
declare @tbl1 table(
	id int,
	kbn nchar(10) ,
	point int
)

declare @start_id as int
set @start_id=0

while @start_id < 10
	begin
		print @start_id
		insert into @tbl1 values(@start_id, @start_id % 3, @start_id * Rand() * 10)
		set @start_id = @start_id +1
	end

select * from @tbl1

declare @test_id int, @test_point int
declare @add_point int
set @add_point=100

--カーソル
declare test_cursor cursor for
select id, point from @tbl1 where kbn = 1 order by id
open test_cursor

fetch next from test_cursor into @test_id, @test_point

while @@FETCH_STATUS = 0
begin
	update @tbl1 set point+=@add_point where id=@test_id
	set @add_point=@test_point
	fetch next from test_cursor into @test_id, @test_point
end
close test_cursor
deallocate test_cursor

select * from @tbl1

実行結果
sql-result02

以上、カーソル CURSORの使い方まで

 

【SQL Server】算術演算子

今回はSQL Serverの算術演算子です。
SQLの仕事から離れて、また戻ってくるとMOD(余剰)の演算子を忘れています。

SQL SERVERの算術演算子

 

operator 演算子 意味
加算 + 加算
減算 減算
乗算 * 乗算
除算 / 除算
剰余 % 除算による整数の剰余を返します。 たとえば、12 % 5 の場合、12 を 5 で割ると余りは 2 なので、12 % 5 = 2 となります。

簡単なSQLで確かめてみます。

declare @tbl1 table(num1 int, num2 int)

insert into @tbl1 values(4, 2)
insert into @tbl1 values(5, 2)
insert into @tbl1 values(6, 2)
insert into @tbl1 values(7, 3)
insert into @tbl1 values(8, 3)

select num1, num2, num1 + num2 as '加算', num1 - num2  as '減算',num1 * num2 as '乗算',num1 / num2 as '割算',num1 % num2 as '剰余' from @tbl1

SQLの結果です。
sql-result01

以上、SQL SERVERの算術演算子でした。