[mongo]配列カラム内の連想配列の複数条件一致検索

はまったのでメモ

[{
id:1,
name:"A class",
array_data:[
    {age:17, sex:"f", height:160, wight:40},
    {age:18, sex:"f", height:150, wight:35},
    {age:19, sex:"f", height:170, wight:45}
  ]
},
{
id:2,
name:"B class",
array_data:[
    {age:17, sex:"m", height:160, wight:50},
    {age:18, sex:"m", height:150, wight:55},
    {age:19, sex:"m", height:170, wight:65}
  ]
}
]

上記のようなデータが存在した場合に
array_dataカラムの配列中にage=18 且つ sex=”m”のある行のデータだけ
取得したい場合の書き方を下記に記述します。

db.hoge.find({
  "array_data.age":18,
  "array_data.sex":"m",
  $where: function(){
    var arr = this.array_data;
    for (var i in arr) {
      if (arr[i].age==18 && arr[i].sex == "m"){
        return true;
      }
    }
   return false;
  }
});

結果はid:2の行のみを取得できます。
※$whereのスクリプトを書かないとid:1も対象として取得されます。

また、phpでも上記$where部分を書けば思った通りのデータ行が取得できます。
更にarray_data内の該当行のみを取得する場合は、
プログラムで該当の連想配列行を取得する必要があります。

記憶を辿り書いてしまっているので誤って書いている部分があるかもしれまん、、

スポンサーリンク

[メモ]firefoxのメモリバカ食い[おまじない]

Firefox34にしてからメモリがバカ食いして、既に開いていたタブを表示しようとしたときにハングし、別windowに分離してしまうなどということが発生しまくっていました。

そこで、gigazinさんの記事を見つけ、以下の事がかかれていました。

1. アドレスバーに「about:config」と入力してEnterキーを押す
2. 開いたページ上で右クリックして「新規作成」→「Boolean」をクリック
3. 設定名を「config.trim_on_minimize」として「OK」をクリック
4. 真偽値として「true」を入力して「OK」をクリック
5. Mozillaを再起動する

今のところ、メモリのバカ食いはないみたいですので、メモメモと・・・

スポンサーリンク

[メモ]アニメーションgifのチェック[php]

おひさしぶりです。

タイトルの通り、チェック対象のファイルがアニメーションgifかそうじゃないかのチェックプログラムを・・・

で、とほほさんのGIFフォーマットの詳細を参考にしてみました。

/**
 * アニメーションGIFかチェック
 *
 * @params string $img_file   画像ファイル(画像ファイルまでのPATH付き)
 * @return bool               true:アニメーションGIF false:それ以外
 */
function checkAnimationGif($img_file) {
    if (!file_exists($img_file)) {
        // ファイルが無い
        return false;
    }
    if (!($fp = fopen($img_file, "rb"))) return false;
    $head = fread($fp, 6);
    if (!preg_match("/^GIF89a/", $head)) {
        // GIF89a 以外
        return false;
    }
    // カウント初期化
    $gce_cnt = 0;
    while (!feof($fp)) {
        if (bin2hex(fread($fp, 1)) != "21") continue;
        switch (bin2hex(fread($fp, 2))) {
            /*
            // 2014-11-06 削除
            case "ff0b": // Application Extension
                fclose($fp);
                return true;
                break;
            */
            case "f904": // Graphic Control Extension
                $gce_cnt++;
                if ($gce_cnt > 1) {
                    fclose($fp);
                    unset($gce_cnt);
                    return true;
                }
                break;
        }
    }
    fclose($fp);
    unset($gce_cnt);
    return false;
}

多分これで、チェックできるはず・・・

追記:2014-11-06
adobeのフォトショップで作成されたgifでApplication Extensionが含まれる通常のgifが作成されていることがわかりましたので
上記のソースを修正しました。

スポンサーリンク

[メモ]twitter REST API による複数画像付きツイートの仕方

久方ぶりです。

今回は、twitterのAPIでツイートに複数の画像を指定する仕方を記述します。

基本的には、次のURLの通り・・・
https://dev.twitter.com/docs/api/multiple-media-extended-entities

で、見に行くの面倒な人用に、簡単に書くと以下の通り

https://upload.twitter.com/1.1/media/upload.json

上記エンドポイントに対して、画像ファイルを1つずつuploadします。
uploadが成功すると

{
	"image": {
		"w": 1546,
		"h": 1024,
		"image_type": "image\/jpeg"
	},
	"media_id": 460938773744717825,
	"media_id_string": "460938773744717825",
	"size": 530963
}

このような、値が返って来ます。
で、返ってきた「media_id」か「media_id_string」を使ってツイートのREST APIをたたきます。

ツイートするためのエンドポイントは以下の通りです。

https://api.twitter.com/1.1/statuses/update.json
※uploadした画像のmedia_idが有効な時間はuploadしてから60分らしいです。
上記のリンク先にそんなことが書かれていた気がします。

で、、画像付きをツイートするには、今まで通りのパラメータに「media_ids」パラメータを追加します。
「media_ids」は先ほどuploadしたときの返り値のmedia_idを最大4つ(2014-06-25現在)まで設定できます。
複数指定のしかたはmedia_idをカンマ区切りで記述すればOKです。

因みに、ツイート時に5つのmedia_idを設定すると次のエラーコードとメッセージがjsonで返ってきました。
code=44
message=media_ids parameter is invalid.

また、画像1枚だけを上記の要領でツイートすると、ツイートはされますが、公式のタイムラインに初期表示として画像が表示されないようです。(2014-06-25現在)
なので、1枚しかないのであれば、今まで通り以下のREST APIを使用するのがいいと思います。

https://api.twitter.com/1.1/statuses/update_with_media.json

以上、ちょっとした覚書でした。

2014-10-31 追記:
アニメーションgifは1枚のみ可能。
アニメーションgif + jpg ×
アニメーションgif + 通常のgif ×

2015-05-21 追加:
エンドポイント /1.1/statuses/update_with_media.jsonが本日使用できなくなったっぽいです。
また、公式のweb表示も1枚のときでも正しくサムネイル表示されるようになっているようです。
※これはいつからなおったのか確認していません・・

スポンサーリンク