水曜日, 2月 15, 2012

PHP's overload: __call()

In my last blog, I wrote about PHP's get/set "overload", or hooking those methods for private members. There are more overloading method in PHP. The __call() method overload methods. This method "overloads" hidden member functions; including those methods that are non-existent. That is, you can create on the spot a brand new method just by calling __call().
class Test
{
  function __call($name,$parameter)
  {
    $value=$parameter[0];
    switch($name)
      {
      case "round":
        $value=round($value);
        break;
      case "floor":
        $value=floor($value);
        break;
      case "ceil":
        $value=ceil($value);
        break;
      }
    return $value;
  }
}

$test=new Test;
echo "Rounding: round(16.4) = ".$test->round(16.4);
echo "<br />";
echo "Floor: floor(16.4) = ".$test->floor(16.4);
echo "<br />";
echo "Ceiling: ceil(16.4) = ".$test->ceil(16.4);
echo "<br />";
This actually is a potential technological breakthrough -- in that the methods bears arbitrary names that are pseudo-defined and typed not dynamically then at programming time. This is a conceptual revolution in the programming. Remember, OOP is just a different form of C's structure.
Rounding: round(16.4) = 16
Floor: floor(16.4) = 16
Ceiling: ceil(16.4) = 17

月曜日, 2月 13, 2012

"Overload"? or hooking get/set in PHP

In PHP, there are a set of functions that hooks getting and setting private member variables.  When the variable is set, __set() method will be called.  When the variable is accessed, __get() method is called.  In PHP's terminology, hooking variable definition and retrieval are called overloading. 

class HookTest
{
private $a=1;

public function __get($name)
{
  echo "$name is being retrieved<br />";
  return $this->$name;
}

public function __set($name,$value)
{
  echo "$name is being set<br />";
  $this->$name=3;
}
}

echo "<pre>";

$test=new HookTest;
$test->a=2;
echo $test->a;

金曜日, 2月 10, 2012

Newline in select-option tags

Our site had a list of fonts available for our clients. The list included, European and Cyrillic fonts. We put them in a drop-down list.

List of fonts:
     European
     Cyrillic

Then, it turned out to be that Cyrillic fonts were included in European fonts. We had to select/deselect both at the same time. The trouble is, the HTML's select's option does not take br tags, or new lines. All lines have to be in a single line. Here is a jQuery code that select/deselect European and Cyrillic fonts at the same time. The code hooks any click on the European fonts to a handler that select/deselect Cyrillic fonts.
 
    $('#European').live("click",function(){
     var selected=$('#European').attr("selected");
     if(selected=="selected") 
  {
      $('#Cyrillic').attr("selected","selected");      
  }
     else
  {
      $('#Cyrillic').attr("selected",false);      
  }    
 });

Here is a word of caution; we had yet another problem with the Cyrillic option with the reset operation. The Cyrillic option has to be deselected manually.
 
    // de-selects the Cyrillic option.
    $("#reset").click(function(){
         $('#Cyrillic').attr("selected",false);      
 });

水曜日, 1月 25, 2012

同じエレメントを指定して、なぜか表示が変わらない。

スタイルシートというのは、いまだ原始的な形態を保ち続け、多少なりとも論理を重視するプログラマ人種にとっての頭痛の種といえるでしょう。進化を続けるネット世界で、基準を設定するのは至難の業、軍閥割拠のジャングルのなかで右往左往してサバイバルゲームを続けるしかない。

で、今日の話題はエレメントの指定方法。スタイルシートで、同じエレメントを指定して、なぜか表示が変わらない。

table.background tr td
{
background-color:red;
}
table.background td
{
background-color:blue;
}

赤い指定をオーバーライドしているのに、これが青くならない。

<table class="background">
<tr><td>test<td>test
<tr><td>test<td>test
</table>

上記のスタイルの指定をよく見てみると、エレメントの指定方法に違いがあります。なぜか tr タグの指定が効いてるんですね。構造を書くと、そちらが優先されるアルゴリズムであるわけです。

これが意味のある基準であるかどうかはさておいて、知っておかないと他人のスタイルシートを使うときに困ることは間違いなしです。

金曜日, 12月 30, 2011

Javascriptの多次元配列

やられましたね。これ。Javascriptの多次元配列。

var array=new Array();
array[0,0]=0;
array[1,0]=1;

alert(array[0,0]);
alert(array[1,0]);

結論的には、双方ともに1を表示します。

皆さんも気をつけましょう。

謹賀新年

月曜日, 12月 12, 2011

桁数を取得するコード

間違い探し、です。よくありそうな感じもしますが載せておきます。

ある数字の桁数を得たいとします。valに格納されていると仮定してください。

10進法であるか、16進法であるか、ベースはbaseで示すことにします。

  int index=1;
  while(val/=base && ++index<len);

一見これで桁数が出る... と思った方。

悩みましたね。これだと浮動小数点エラーが出ます。GCC使ってます。

知ってしまえばどうということはないことです。

ここであっさりと書いておきますが、オペレーターの優先順位の問題でした。

括弧で囲ってやると正常に機能します。

お騒がせしました。

金曜日, 11月 18, 2011

Multiple OS's causes DLL problems.

Theoretically -- is it a theory -- any program that runs on the particular Framework should run in the same way. But -- WINDOWS, how else could it be? The application does not find COM components and fails to initialize classes. Is it the issue of registry keys damaged by the installation?

After close monitoring of Windows event, it turned out that when multiple OS's are installed in a machine, the OS seems to assume C: drive even when the system is installed in other drives. The application looks for drivers -- but in which drive, is the question. The C: drive application looks for D: DLL's when E: application looks for E: DLL's. Either case does not work. Only the D: application with D: DLL's worked.

日曜日, 11月 13, 2011

OAuth

Twitter uses OAuth for id verification. The encryption of the data is
using HMAC-SHA1 algorithm.

HMAC, Keyed-Hashing for Message Authentication Code
hash((key xor 0x5c5c...5c)
or (key xor 0x3636...36)
or message)

SHA, Secure Hash Algorithm
SHA-1 160 bit, MD4 based encoding

水曜日, 11月 09, 2011

C#: FontDialog unable to set font sizes; Firefox 8

The FontDialog class of C# is not overridable to change its settings. There are flags to remove underline and strike options, but there is no ways to limit font styles nor font sizes.

However, C# is a language that has ready-to-use off-the-shelf components that can replace the font dialog with ones of your own.



The new features in Firefox 8:
- twitter search
- delay loading tabs at start ups (when you set it the opening screen)
- WebGL, HTML5 improvements

月曜日, 11月 07, 2011

C#: WebBrowser.DocumentText does not support the += operator

WebBrowser.DocumentText does not support the += operator.

That is it. It does not. The String class should be formatted separately and assigned to that member variable.

金曜日, 11月 04, 2011

C# DataGridView's SetValue

When a DataTable is set for a DataGridView, the value can not be set
to DataGridViewCellFormattingEventArgs.Value, which is passed by to a
method that is hooked to CellFormatting event.

The way to avoid it, is to access to the cell value directly.
private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
  if(e.ColumnIndex==5)
    {
      // If set, the following will be shown in the cell.  The Cell's value typed as an int will not be set correctly.
      //e.Value = "1";
                        
      // Instead, directly access the Cell object.
      int row = e.RowIndex;
      int col = e.ColumnIndex;
      dataGridView1.Rows[row].Cells[col].Value = 1;
                   
      break;
    } 
}

木曜日, 10月 27, 2011

C#: TimeZoneInfo.GetSystemTimeZones()

TimeZoneInfo.GetSystemTimeZones() returns a reference to a same instance, no matter how many times it is called.

When the time zone list is added to combo boxes, they select the same values.

comboBox1.DataSource = TimeZoneInfo.GetSystemTimeZones();
comboBox2.DataSource = TimeZoneInfo.GetSystemTimeZones();

The Collection class must be copied to some other forms.

System.Collections.ObjectModel.ReadOnlyCollection list 
= TimeZoneInfo.GetSystemTimeZones();
TimeZoneInfo[] tzList = list.ToArray();
comboBox1.Items.AddRange(tzList);
comboBox2.Items.AddRange(tzList);

火曜日, 10月 18, 2011

Excel / VBA: type conversion from integer to text

Excel uses VBA for its macros. The programming language, or the formula format, differs. Whereas Excel uses "TEXT()" with a format string as its argument, VBA uses "CStr()" to convert types from integer to string.

月曜日, 10月 10, 2011

C# field initializers

C# differs from Java in that the field initializers must be static.

This is perfectly OK in Java.

public class InitTest
{
    int test=0;
    InitTestClass testClass=new InitTestClass(test);
    
    public static void main(String args[])
    {
 InitTest test=new InitTest(); 
    }
}

class InitTestClass
{
    int test=0;
    InitTestClass(int test)
    {
 this.test=test;
    }
}

The following code, however, is not (C#).

namespace InitTest
{
    class Program
    {
        int test = 0;
        // Error
        InitTestClass testClass = new InitTestClass(test);

        static void Main(string[] args)
        {
        }
    }

    class InitTestClass
    {
        int test = 0;
        public InitTestClass(int test)
        {
            this.test = test;
        }
    }
}

木曜日, 9月 29, 2011

The merit of using C#

The code library in C#, comprised of classes that abstract and encapsulate such notions such as instruction set, font data, model number etc. What is good at this library is it runs threads and the 'server' takes commands and send them for number of times until they are passed to the module. Namely, the commands is queue until the event is processed.

A server is also called daemon that runs as a separate process along with the main procedure.

A queue is a FIFO that stack data for processing when the resources are available.

An event is a chunk of data that will be passed to the queue which contains the necessary data for each transaction.

Abstraction is a process that parameterize any variables that can be applied to same sort of procedure.

Encapsulation is a process to separate a set of data from direct manipulation so that any modification to the data will be monitored.

A thread is a process that can be processed pseudo simultaneously. The processor process each thread one at a time so it is pseudo-simultaneous.

With this library, commands are passed to the module in a safer and more secure manner. The server can wait, for sending data and receiving the data at the same time while queuing other data as well.

水曜日, 8月 31, 2011

Java and C++ Exception Handling

Java and C++ differs in how to handle exceptions. In Java, every possible exception must be handled. In C++, the exceptions handling can be omitted.

The demerit of not having to write exception handling procedure is not of optimization but in the safe programming practice. The exceptions readied for the methods will be thrown away, which might cause some fatal errors. Java has it that those have to be taken care of. Every method that throws exceptions must declare as "throws Exception" or any exception class. When the method is called, it must be in the try-catch block.

The counter argument is that when exception handling can be omitted, the code can be short as pointed out by this g++ user(s), the program size will not be affected unless the exceptions are explicitly stated to be thrown and handled in case of the g++ compiler. You can safely ignore any error message the original library writer tried to warn you in calling the methods. And those who use the method won't be warned as well.

There is no way to assume that any method won't throw exceptions, unless explicitly stated as in Java code, as throws Exception. Going through all the possibilities to make sure that the method that you are calling does not call just any method that throws exceptions, is if not an impossible task then tedious work. Therefore, this practice may leave the programmer unsafe and the products made from those libraries.

火曜日, 8月 16, 2011

Why, just why?


The Professional edition of Visual Studio 2010 C++ does not compile dependent projects right. 

It does not compile the static or dynamic libraries even when the configuration is set to compile them.  This bug is more annoying since it says Rebuild All Succeeded when it is set to be compiled from the main project.  This can be avoided if the project is compiled separately. 

This is such a major bug that it is rather puzzling it is not set in that way, particularly in C++.  Could there a way to compile them all together?

土曜日, 8月 13, 2011

Visual Studio: Refactoring

Microsoft's Visual Studio has a very nice feature called 'refactor'.  It replaces the names of a method or function to whatever you rename it.  It does contextual search and replace.  The same name used in other namespace or scope will not be affected.  It alleviates all the troubles associated with renaming.  In the end, the code would come up closer to the final products no matter how you change your course of programming.

Visual Studio's C# refactor, however, is not perfect.  It replaces the names even when there are the same names within the scope.  There is no way to distinguish the variables that has renamed and the existing variables with the same name.  That certainly is detectable.  As for C++ version of the IDE, there isn't such a function to rename methods and variables with contextual searches.

土曜日, 8月 06, 2011

C#の列挙型

C#の列挙型は特殊です。

列挙型は、Cなどでは定数程度としか使えませんが、C#では名前を取得したり、オブジェクトから列挙型の値を得ることができます。

FontStyle fontStyle = (FontStyle)Enum.Parse(typeof(FontStyle), (string)obj);




「今までと違う」列挙型は、なにも嫌がらせのためにあるわけではなく、これこそはコンピュータ科学の成果であり、技術の進歩...と声を大にして言いたいところですが、あまり主張すると「シカト」などの憂き目にあうのでリーマン稼業の人間には注意が必要です。

改革は、草の根から...ですね。

木曜日, 7月 28, 2011

C#: ComboBox をカスタマイズする

ComboBox リスト項目の描画をカスタマイズし、チェックマークなど描く方法を説明します。

ComboBox のリスト項目は、単なる Object クラスです。つまり、リスト項目クラスを継承などしてデータを追加することはできません。適宜、ComboBox クラスにリストなどデータ構造を用意してデータを保存します。

データの準備ができたら、ComboBox のプロパティで DrawMode を OwnerDrawVariable に変更してやります。ここを変更すると、リスト項目の描画イベントをオーバーライドすることができます。DrawItem イベントに、イベントハンドラを追加し、描画手順を記述します。

具体的にはこのように描画をすべて記述することになります。

private void comboBox1_DrawItem(object sender, DrawItemEventArgs e)
        {
            e.DrawBackground();

            if (e.Index < comboBox1.Items.Count)
            {
                e.Graphics.DrawString((string)comboBox1.Items[e.Index], e.Font, Brushes.Black, e.Bounds);

                if (e.Index < modifiedMessages.Count() && modifiedMessages[e.Index])
                {
                    Bitmap bmp = new Bitmap(Properties.Resources.checkMark);
                    int iconWidth = 16;
                    int iconHeight = 16;
                    e.Graphics.DrawImage(bmp, e.Bounds.Right - iconWidth, e.Bounds.Bottom - iconHeight, iconWidth, iconHeight);
                }
            }

            e.DrawFocusRectangle();
        }

Flask の Blueprint のテンプレート問題

  Flask の Blueprint は、ルート、静的ファイル、テンプレートをまとめて管理できます。しかし、テンプレートが指定できません。 ここでは、Blueprint の template_folder の問題点と回避策を説明します。 Blueprint のテンプレート問題...