2014年11月12日

Lua 5.3の整数型

Lua 5.3で追加された待望(?)の整数型に関するメモです。Lua 5.3 beta時点のものでリリース版では変更となる可能性があります。

整数型はデフォルトではC言語のlong longもしくは__int64(Windows)で、コンパイル時に"LUA_32BITS"が定義されているとlong、"LUA_INT_INT"が定義されているとint、"LUA_INT_SHORT"が定義されているとshort intが使用されます。short intはテスト用に用意されているだけで非推奨のようです。

ちなみに、数値型はデフォルトではdoubleで、コンパイル時に"LUA_32BITS"が定義されているとfloat、"LUA_REAL_LONGDOUBLE"が定義されているとlong doubleが使用されます。Lua 5.2ではdoubleが使用されています。

この辺りの詳細は、luaconf.hをご覧ください。

 
Lua 5.2にあったbit32ライブラリが廃止され、ビット演算子が導入されました。
& 論理積
| 論理和
~ 排他的論理和
<< 左シフト
>> 右シフト
~ 否定

以下、使用例です。
print( 10 & 8 )   --> 8
print( 8 | 1 )   --> 9
print( 255 ~ 15 )   --> 240
print( 8 << 1 )   --> 16
print( 8 >> 1 )   --> 4
print( ~0 )   --> -1

 
また、整数用の演算子が1つ追加されています。割り切れないときはマイナス方向に丸めるようです。
// 整数除算
以下、除算演算子と整数除算演算子の使用例です。
print( 10 / 6 )   --> 1.6666666666667
print( 10 // 6 )   --> 1
print( 10 / 9 )  --> 1.1111111111111
print( 10 // 9 )  --> 1
print( -10 / 9 )   --> -1.1111111111111
print( -10 // 9 )   --> -2
print( 10.0 // 3.0 )   --> 3   ( 10.0と3.0は整数で表現可能なのでOK )
print( 10.5 // 3.0 )   -->  エラー!   ( 10.5は整数で表現不可能なのでNG )
print( 10.0 // 3.5 )   -->  エラー!   ( 3.5は整数で表現不可能なのでNG )


数値型が文字列に変換されるときに、小数点以下の数値がゼロのときでも".0"が付加されるようになりました。

-- Lua 5.2
print( 2.0 )   --> 2
print( 2 )   --> 2

-- Lua 5.3
print( 2.0 )   --> 2.0
print( 2 )   --> 2

Lua 5.2と同じ結果を得るには、前述の整数除算演算子を使用するか、5.3で追加されたmath.tointeger関数を使用します。math.tointegerは1つの引数をとり、引数が整数で表現可能であればその整数を返し、整数で表現不可能であればnilを返します。
x = 2.0
xx = math.tointeger( x )
if not xx then
    xx = x
end
print( xx )   --> 2




【参照】
Lua 5.3 Reference Manual
http://www.lua.org/work/doc/manual.html

2014年10月24日

Luaの文字列リテラル

Luaの文字列リテラルの字句構造についてのメモです。

Luaの文字列リテラルは対応するシングルクォートまたはダブルクォートで囲みます。
文字列リテラルの中には、以下のエスケープシーケンスを含むことができます。
それぞれ、対応するLuaのバージョンを示し、Lua 5.3については5.3(alpha)の時点のものとします。


制御文字 (Lua 5.1, 5.2, 5.3)


\a   -   bell、ベル
\b   -   backspace、後退
\f   -   form feed、改頁
\n   -   newline、改行
\r   -   carriage return、復帰
\t   -   horizontal tab、水平タブ
\v   -   virtical tab、垂直タブ
\\   -   back slash、バックスラッシュ
\"   -   double quote、引用符・ダブルクォート
\'   -   apostrophe (single quote)、アポストロフィ (シングルクォート)
\(実際の改行)   -   改行
\z   -   後続の改行を含むスペース文字をスキップします。

バイト値 10進数 (Lua 5.1, 5.2, 5.3)


\ddd   -   dddは最大3桁の10進数 (0〜255) で、後続に数字があるときは0を左詰めして3桁にします。

バイト値 16進数 (Lua 5.2, 5.3)


\xXX   -   XXは2桁の16進数 (00 〜 FF)。

Unicode (Lua 5.3)


\u{XXX}   -   XXXは1文字以上の16進数 (0〜10FFFF)。波括弧で囲む点に注意。内部ではUTF-8として扱われます。

長括弧 (Lua 5.1, 5.2, 5.3)


Luaの文字リテラルは長括弧 ( [[, ]] ) で囲むこともできます。
長括弧内ではエスケープシーケンスは無視され、改行は改行そのものとして扱われます。ただし、開き長括弧の直後の改行は無視されます。
レベル0長括弧 ( [[, ]] )、レベル1長括弧 ( [=[, ]=] ) 、さらにレベル2長括弧 ( [==[, ]==] )と角括弧に任意の個数の等号を加えた形式にすることもできますが、開き長括弧と閉じ長括弧のレベルは同じである必要があります。

Luaの文字列リテラルは単なるバイト列で文字コードに依存しませんが、Shift_JISなどの2バイト目が0x5C(バックスラッシュまたは円記号)となりうる文字コードではそれがエスケープシーケンスとして扱われてしまい問題となります。いわゆるダメ文字です。その場合、他の言語でもありがちですが以下のように2つ重ねることで文字そのものとすることができます。

print( "表\" )      --   Shift_JISにおける print( "\149\\" ) と同じ

長括弧がエスケープシーケンスを無視する性質であることを利用して以下のようにも記述できます。

print( [[表]] )

今日一般的によく使われると思われるUTF-8ではこのような考慮は不要です。
というわけで、Windows版ですが、文字列リテラルをUTF-8固定としてUnicode版の各種WindowsAPIやCランタイム関数を呼ぶようにパッチを当てたLuaの派生を作りました。CorvusSKKに組み込む目的で作りましたが、Luaの部分を抜き出した形で公開したものです。

lua-u8w
https://github.com/nathancorvussolis/lua-u8w

Lua 5.3のリリース版はまだかなと思っていたら先程ベータ版が出たようです。
http://www.lua.org/work/



【参照】

Lua 5.1 - Lexical Conventions
http://www.lua.org/manual/5.1/manual.html#2.1

Lua 5.2 - Lexical Conventions
http://www.lua.org/manual/5.2/manual.html#3.1

Lua 5.3(alpha) - Lexical Conventions
http://www.lua.org/work/doc/manual.html#3.1

2014年10月19日

IME開発者向けリンク集

CorvusSKKというDDSKKの入力方式を用いたWindowsで動くIMEを開発しております。
DOS、Windowsの世界では過去に様々なFEP、IMEが存在していましたが、現在のWindowsにおいては選択肢がちょっと少ないのでは?ということで、これからIMEを作ってみたい方向けに有益かと思われるリンクをまとめてみました。



Text Services Framework (TSF) 実装例

  • ソースコードが公開されているもの
    • CorvusSKK
      • 手前味噌ですみません。
    • tsf-tutcode
      • CorvusSKKをフォークして頂きました。漢字直接入力機能が追加されています。
    • tsf-vim
      • vi風な操作をIMEとして実装されたもの
    • Mozc
      • Google日本語入力のオープンソース版。辞書はそれに劣るようですが、Mac、Linux、Android、ChromeOSでも動くそうです。
  • ソースコードが公開されていないもの
    • SKK日本語入力FEP (SKKFEP)
      • SKKの操作性をベースに革新的な機能が盛り沢山なIMEです。一度はまると抜け出せなくなります。
    • Google日本語入力
      • あのGoogleがIMEを作った!と衝撃が走ったのは記憶に新しいところ。Windows 7まではIMM32実装が、Windows 8以降でTSF実装が使用されます。
    • MS-IME
      • Windowsに標準で組み込まれています。リンクはMS-IME2010のものですが、OfficeのライセンスがあればXP、Vista、7で使用可能です。
    • ATOK
      • 賢い変換が可能だそうです。個人的には試用版を少し触れた程度なので
    • Baidu IME
      •  検索エンジンのサービスを開発運用しているとIMEも作っちゃおうぜみたいになるのでしょうか。
    • WinAnthy
      • Anthyの移植版
    • Social IME
      • インターネット経由でかな漢字変換を行うユーザー参加型のIME。以前ソースコードが公開されていたみたいなのですが現在では見付かりませんでした。

Text Services Framework (TSF) 全般




WindowsにおけるIMEは、notepad.exeやexplorer.exeなどのプロセスにIMEのDLLがロードされた状態で動きます。IMEのDLLはプロセス側と同等のアクセス制限が課されるため、ファイルアクセスやプロセス間通信を行うときにそれを考慮しなければなりません。

セキュリティ全般



Internat Explorer

Windows Vista 以降の Internet Explorer の保護モードについて

AppContainer

Windows 8 以降のAppContainerについて


Adobe Sandbox

Adobe Acrobat/Reader X以降、Firefox 4.0以降で動くAdobe Flash Player 11.3以降で有効となるサンドボックスについて



 ざっとこんなところでしょうか。