プログラミング

Cのブリッジライブラリからテーブルを受け取る

今まで、lua_pushstringして文字列を取得する形でしか使って来なかったのですが、テーブルを受け取りたくなったのでやってみました。


static int test(lua_State *L)
{
  const char *str = luaL_checkstring(L, 1);
  int i;

  lua_newtable(L);
  for ( i=0; i<4; i++ ) {
    lua_pushstring(L, i + 1);
    lua_pushstring(L, (unsigned char *)str);
    lua_settable(L, -3);
  }

  return 1;
}

これでこんな感じで取れる

[“aaa”,”aaa”,”aaa”,”aaa”]

Cからluaにテーブル渡せるということは、いろいろCで実装出来るので便利。

hiredis使ってみた

luaでresty.redis使ってるんですが、どうも安定しないのでhiredisを使おうと思う。
まずはhsetとhgetallのサンプル書いて動作確認してみた。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <hiredis/hiredis.h>
 
int main(void) {
 
  char       *key1 = "aaaa";
  char       *key2 = "bbbb";
  char       *val  = "1111";
  redisReply *reply;
  int         i;
 
  redisContext *c = redisConnect("127.0.0.1", 6379);
  if (c->err) {
    printf("redisConnect Error: %s\n", c->errstr);
    return (-1);
  }
 
  // HSET                                                                                                                                                                           
  reply = redisCommand(c, "HSET %s %s %s", key1, key2, val);
  freeReplyObject(reply);
 
  // HGETALL                                                                                                                                                                        
  reply = redisCommand(c, "HGETALL %s", key1);
  if ( reply->type == REDIS_REPLY_ERROR ) {
    printf("redisCommand Error: %s\n", c->errstr);
  }
  else if (reply->type == REDIS_REPLY_ARRAY) {
    printf("hgetall: %s\n", key1);
    for ( i=0; i<reply->elements; i++ ) {
      if ( (i % 2) == 0 ) {
        printf("hkey: %s, ", reply->element[i]->str);
      }
      else {
        printf("value: %s\n", reply->element[i]->str);
      }
    }
  }
  freeReplyObject(reply);
 
  return (0);
}

$ ./a.out
hgetall: aaaa
hkey: bbbb, value: 1111

クロスサイトなAjaxでヘッダーを取得する

クロスサイトなAjaxで、ヘッダーを取得する際にちょっとはまったのでメモ。

例えば、
Ajax

  $.ajax({ type:       "GET",
           url:        "http://url",
           dataType:   "text",
           ifModified: true,
           cache:      true,           
           success: function(data, status, xhr) {
             var etag = xhr.getResponseHeader("ETag");
             alert(etag);
           },
  });

こんな感じでETagヘッダーを取得したいAjaxがあるとして、
下記のようなレスポンスヘッダーだと、Javascriptで取得出来るヘッダーがかなり限られたものだけになります。

レスポンスヘッダー

Access-Control-Allow-Headers: ETag
Access-Control-Allow-Origin: http://url
Access-Control-Allow-Credentials: true

つまり、レスポンス自体はされていてブラウザも受け取っているのですが、
Javascriptに渡されるヘッダーが限られたものになります。
ということで、ブラウザに対してJavascriptに渡してよいヘッダーを、Access-Control-Expose-Headersヘッダーで指定します。

Access-Control-Allow-Headers: ETag
Access-Control-Allow-Origin: http://url
Access-Control-Allow-Credentials: true
Access-Control-Expose-Headers: ETag

これでJavascriptから指定したヘッダーが取得出来るようになります。
尚、*(アスタリスク)の指定も可能です。