次世代C++『C++0x』は2010年正式公開へ

C++ 12年ぶりに次世代スタンダードへ - "C++0x" 策定進み草案公開へ | マイコミジャーナル

ISO C++ Standards Committeeは次世代C++仕様を2010年に正式公開する見通しを立てている。次世代C++仕様が12年ぶり登場することになりそうだ。

標準ライブラリと言語仕様の改訂が大幅に行われたみたいですね。
C++という言語ももう10歳か。
10年経っても廃れるどころか、成長&進化を遂げるのはやっぱりC++という言語の根底がしっかりしているからだと思うし、この先も有用な技術だからだと思った。

標準ライブラリの拡張は個人的にとても嬉しい。STLにはかなりお世話になっているし。

[PDF] Working Draft, Standard for Programming Language C++ -
ワーキングドラフト(草案)もPDFで公開されているから英語力のある方はぜひ。僕もちょっと読んでみます。英語力無いけど・・・(笑)

正式公開は2010年ですが、早く触れてみたい!

#define new の罠

STLはとても便利&強力なC++の標準ライブラリで、かなりお世話になるんですが、エラーが難解なことで有名でもある。
VisualStudioで開発してて、ハマった「わかると、何でもないエラー」をメモしておく。

template,
typename alloc=std::allocator >
class Hoge
{
…略

こんなテンプレートクラスを定義して、このクラスを使おうとして出たエラー。

xmemory(44) : error C2665: 'operator new' : 5 オーバーロードのどれも、すべての引数の型を変換できませんでした

これ。

operator new がどうやら正常に動いていないという。
でも、クラスの定義を確認してもとくにおかしな点はない。

うーん、、、

ううーん、、、


と2時間ほど悩まされた原因が、

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

#include "Hoge.h"

こいつだったと知った時、がっくり来ました orz

#include "Hoge.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

これで解決。

まさか、こんな近くに原因があるとわ…
灯台なんとかっていうし、意外と見落としがちだから気をつけよう。っていう自分への備忘録。

【関連記事】
[C++]atldbgmem.h
(ここでヒントをもらいました。ありがとうございます。)

UnicodeEncodeError:でハマる

Pythonのコードをテストする時はコマンドプロンプト上で実行結果を確認しながらの作業をしているんだけど、ある実行結果を表示する部分で

UnicodeEncodeError: 'cp932' codec can't encode character u'\u2014' in position 21: illegal multibyte sequence

というエラーで失敗する。

どうやら文字エンコーディングの関係だという事は分かったが、どうすれば解決するのか分からない。。。

そこで、色々調べていたら[Java]文字エンコーディング毎のUnicodeマッピングの違いについて。という場所にたどり着き、そこにあった表を引用させて貰うと、

字形 ¢ £ ¬ 〜(JIS X 0212)
マッピング Windows-31J,
MS932
\uFFE0 \uFFE1 \uFFE2 \u2225 \uFF0D \uFF5E \u2015
SJIS \u00A2 \u00A3 \u00AC \u2016 \u2212 \u301C \u2014
EUC-JP \u00A2 \u00A3 \u00AC \u2016 \u2212 \u301C \u2014 \uFF5E
EUCJP-OPEN \u00A2 \u00A3 \u00AC \u2016 \u2212 \u301C \u2014 \uFF5E

RSSをパースしているexpatの文字コードUTF-8なのだが、出力するコードページはcp932。
ここで、Unicodeマッピングの不整合が発生し、UnicodeEncodeError が起きていると推測。

そこで、解決策には心許ないがマッピングの異なる文字の場合、該当の文字を replace して出力という流れにすることで、出力時のエラーを回避することができた。

これは、コマンドプロンプト出力がcp932によるもので、

Web[EUC-JP] → Python[Unicode] → 出力[cp932]

この時に起こるようだ。
ネットでPythonの文字エンコーディングの問題を検索すると、かなりヒットする。みんなも同じ問題に直面したに違いない。
しかも、Python文字コードエンコーディング問題は結構「鬼門」らしい。
いいかげん、Unicodeで統一してほしい。
できなくとも、Unicodeマッピングは他のと統一してよ M$さん。--;

その場しのぎな解決コードです。すいません。

「―」用replace
output_ok_str = output_ng_str.replace(u"\u2014", u"\u2015").encode('cp932')

「¢、£、¬、‖、−、〜」についても同じようにreplaceを掛けてやる。

PythonでXMLの要素を抜き出す[RSSからでしょ編]

PythonでXMLの要素を抜き出す
このアプローチでは問題があることに気付いた!

RSS配信されているニュースは、そのXMLをパースして処理した方が確実で効率的。
いちいちニュースサイトのレイアウト解析して、ニュースのリンクのみ抜き出して・・って時代じゃないよね。-;

ということで再チャレンジ!

新アプローチ手順
1.RSSリンクからXMLをminidomに食わせる
2.あとは前回の方法で、必要なデータを抽出する。

[ Sample.py ]

import urllib2
import sys
from xml.dom import minidom, Node

#今回追加した関数
def urlParse(url):
 # リクエストオブジェクトを構築
 req = urllib2.Request(url)
 # リクエストを送信し、レスポンスを読み出すためのファイルライクなオブジェクトを得る
 opener = urllib2.build_opener()
 #minidomに食わせる
 doc = minidom.parse( opener.open(req) )
 #前回の処理を再利用!
 parseNode( doc )


def parseNode(node):
 titleNodes = node.getElementsByTagName('title') 
 linkNodes = node.getElementsByTagName('link')
 if linkNodes.length == titleNodes.length:
  i=0
  while i < linkNodes.length:
   print titleNodes[i].firstChild.data + " : " + linkNodes[i].firstChild.data
   i+=1
 else:
  print "Error!"

if __name__ == '__main__':
 #アサヒ・コムの一般社会ニュースRSS
 urlParse( "http://rss.asahi.com/f/asahi_national" )

[実行結果]

社会 - アサヒ・コム : http://www.asahi.com/
アイヌ古式舞踊、ユネスコ無形文化遺産に : http://rss.asahi.com/click.phdo?i=81b1621b1f10ec1caf60b7aa318fb15f
オリオン電機、115億円所得隠し指摘 金沢国税局 : http://rss.asahi.com/click.phdo?i=df570a0db77c30cb164211c85b9a201c
「痴漢でっちあげ」女に懲役4年求刑 大阪地検 : http://rss.asahi.com/click.phdo?i=bc56d932f9a1cdcee1116c60a190c669
市役所内で男性刺され重傷 埼玉・新座 : http://rss.asahi.com/click.phdo?i=19d20156fa1ca25cddf8239bf1d48e03
 :
 :(ry

受信系のライブラリをimportして、あとはサクッと受信したXMLをminidomへ渡せばOK。
よし、RSSからのデータ受信はできたぞ!^^