نوری نستعلیق کرننگ پر کام!

mohdumar

محفلین
ہم آپ کے کوڈ کا سرسری جائزہ لے رہے تھے تو محسوس کیا کہ اس میں آپٹیمائزیشن کی کافی گنجائش موجود ہے۔ چونکہ ہم ڈاٹ نیٹ فیملی کی پروگرامنگ زبانوں میں کوئی تجربہ نہیں رکھتے اس لیے براہ راست کوڈ میں تبدیلی نہیں کر رہے، البتہ جہاں تک ہم کوڈ کو سمجھ سکے ہیں اس کی بنیاد پر کچھ تجاویز دیتے ہیں۔ :) :) :)

ہم مثال کے طور پر آپ کے درج ذیل فنکشن کا جائزہ لیتے ہیں:
PHP:
Private Function MaxLeftAtY(ByRef jc As Color(,), ByVal y As Integer, ByRef objBitmap As Bitmap) As Integer

    Dim x As Integer = 0
    Dim maxx As Integer = 0
    Dim notext As Boolean = 1

    Dim retval As Integer = -1

    For x = 0 To objBitmap.Width - 1 Step 1
        If jc(x, y).A = 255 And jc(x, y).G >= 0 Then
            notext = False
            If x > maxx Then
                maxx = x
            End If
        Else
        End If
    Next

    If notext = True Then
    Else
        retval = maxx
    End If
    Return retval
End Function

ہمارا خیال ہے کہ آپ اس فنکشن میں کسی مخصوص اونچائی y پر موجود تمام پکسلز کی قطار میں سے سب سے بائیں جانب موجود سیاہ پکسل کو اخذ کرنا چاہتے ہیں۔ اور یہ فنکش غالباً دائیں جانب موجود ترسیمے کے لیے ہر ممکنہ y اونچائی کے لیے علیحدہ علیحدہ کال کیا جاتا ہوگا۔ اور اگر ہم درست سمجھے ہیں تو آپ اس مخصوص اونچائی y پر موجود تمام پکسلز کا یکے بعد دیگرے جائزہ لیتے ہیں۔ اگر ایسا ہے تو اس میں بہتری کی گنجائش موجود ہے، مثلاً کسی افقی قطار کو بائیں سے دائیں جانب اسکین کیا جائے تو جو پہلا سیاہ پکسل انکاؤنٹر ہو وہیں لوپ بریک کر کے اس قدر کو لوٹایا جا سکتا ہے، کیونکہ اس پکسل کے دائیں طرف جانے پر کوئی بہتر قدر سامنے نہیں آئے گی خواہ ماندہ پکسلز سیاہ ہوں خواہ سفید۔ بعینہ MinRightAtY کے لیے ہر افقی قطار کو دائیں سے بائیں جانب اسکین کیا جانا چاہیے تاکہ اولین سیاہ پکسل پر لوپ کو بریک کیا جا سکے۔ :) :) :)

ویسے x اور maxx کے موازنے کو دیکھ کر ہم نے محسوس کیا ہے کہ آپ کوڈ میں x کی قدر بڑھاتے ہوئے غالباً دائیں سے بائیں رخ پر جا رہے ہوتے ہیں، جبکہ عام مشاہدہ یہ ہے کہ کمپیوٹر گرافکس میں x کوآرڈینیٹ بائیں سے دائیں اور y کوآرڈینیٹ اوپر سے نیچے بڑھتے ہیں۔ کیا ایسی تبدیلی آپ نے کی ہے، یا پھر وی بی کی بٹ میپ لائبریری کا ایسا طریقہ کار ہے، یا پھر آر ٹی ایل موڈ سیٹ کرنے کا کوئی طریقہ کار موجود ہے، یا پھر ہم سے سمجھنے میں ہی کوئی نقص سرزد ہوا ہے؟ :) :) :)

سب سے پہلی بات یہ کہ ہم نے فنکشن کے نام نادستگی میں الٹ ہی رکھ ڈالے۔ مطلب maxleftatY کا جو فنکشن ہے وہ دراصل گرافکل طور پر left word یعنی اردو کے حساب سے بعد میں آنے لفظ، اس کا سب سے دائیں 'سبز' پکسل نکالتا ہے۔
ہم نے کوڈ لکھنے کے پہلے دن ہی اتنے الٹے نام رکھ دیے تھے، بعد میں تبدیل کرنا گوارا نہ کیا کیونکہ اس سے ہمارے ذہن میں بنا فنکشنز کا نقش تبدیل کرنا پڑتا۔ :)
تاہم اپلوڈ کرتے ہوئے کوڈ میں کچھ نہ کچھ کمنٹ کرنا چاہئے تھا۔ بلاضرورت کنفیوژن کے لئے معذرت :(

دوسرا جو آپ نے لوپ بریک کرنے کی تجویز کی ہے، گمان ہوتا ہے کہ کافی دن قبل ایسی کچھ تبدیلی کی گئی تھی لیکن یاد نہیں کس وجہ سے تبدیلی کو واپس کر دیا تھا۔ ابھی پھر کر کے دیکھتا ہوں۔:)
 

mohdumar

محفلین
ابن سعید
میں یہاں یہ جاننا چاہوں گا کہ جب ہمارے پاس تمام پیئرز کی کرننگ ویلیوز موجود ہوں تو کیا ہم انکو Single Adjustment کی بنیاد پر پارس کروا سکتے ہیں؟ اسطرح کے پروگرام مطلوبہ پیئر کی ایکزیکٹ کرننگ ویلیو اٹھائے او ر اسے قریب ترین 100ویں پکسل کے حساب سے سیٹ کر دے۔ اب اگر اسے پیئرکی کرننگ ویلیو -500 حاصل ہوئی تو اس پیئر کو پانچ ٹیبلز میں تقسیم کر دے جہا ں ہر ٹیبل کی کرننگ ویلیو -100 ڈیفائنڈ ہو۔ پھر یہی عمل ہر پیئر کے ساتھ دہرایا جائے۔ یوں تمام پیئرز اپنے لاجیکل ٹیبل میں پہنچ جائیں گے۔

100 کا multiple کرنے کی کوئی خاص وجہ ہو تو ضرور بتائیے! کیونکہ راونڈنگ سے تو کرننگ خراب ہوتی ہے۔
اور اگر کرننگ ویلیو -50 ہو تو؟
 

arifkarim

معطل
100 کا multiple کرنے کی کوئی خاص وجہ ہو تو ضرور بتائیے! کیونکہ راونڈنگ سے تو کرننگ خراب ہوتی ہے۔
اور اگر کرننگ ویلیو -50 ہو تو؟
یہ صرف ایک مثالی عدد ہے۔ آپ -50 بھی استعمال کر سکتے ہیں البتہ پھر ٹیبلز کی تعداد بڑھانی پڑے گی۔ راؤنڈنگ کا مقصد گروپ کرننگ ٹیبل کو آپٹیمائز کرنا ہے۔
 
سب سے پہلی بات یہ کہ ہم نے فنکشن کے نام نادستگی میں الٹ ہی رکھ ڈالے۔ مطلب maxleftatY کا جو فنکشن ہے وہ دراصل گرافکل طور پر left word یعنی اردو کے حساب سے بعد میں آنے لفظ، اس کا سب سے دائیں 'سبز' پکسل نکالتا ہے۔
ہم نے کوڈ لکھنے کے پہلے دن ہی اتنے الٹے نام رکھ دیے تھے، بعد میں تبدیل کرنا گوارا نہ کیا کیونکہ اس سے ہمارے ذہن میں بنا فنکشنز کا نقش تبدیل کرنا پڑتا۔ :)
تاہم اپلوڈ کرتے ہوئے کوڈ میں کچھ نہ کچھ کمنٹ کرنا چاہئے تھا۔ بلاضرورت کنفیوژن کے لئے معذرت :(

دوسرا جو آپ نے لوپ بریک کرنے کی تجویز کی ہے، گمان ہوتا ہے کہ کافی دن قبل ایسی کچھ تبدیلی کی گئی تھی لیکن یاد نہیں کس وجہ سے تبدیلی کو واپس کر دیا تھا۔ ابھی پھر کر کے دیکھتا ہوں۔:)
بھئی نام کے حوالے سے محتاط رہنا چاہیے، خاص کر تب جب کوڈ کسی اور کی نظروں سے گزرنے والا ہو۔ واقعی ہم حیران تھے کہ یہ کیا ماجرا ہے، x کوآرڈینیٹ دائیں سے بائیں کب سے ماپے جانے لگے۔ بہر کیف آپ کی وضاحت کے بعد ہم نے مذکورہ فنکشن کو تبدیل کرنے کی کوشش کی ہے۔ وی بی سے نا واقفیت کے باعث سنٹیکس وغیرہ کا مسئلہ ہو سکتا ہے۔ :) :) :)
PHP:
Private Function MaxLeftAtY(ByRef jc As Color(,), ByVal y As Integer, ByRef objBitmap As Bitmap) As Integer

    Dim retval As Integer = -1

    For x As Integer = (objBitmap.Width - 1) To 0 Step -1
        If jc(x, y).A = 255 And jc(x, y).G >= 0 Then
            retval = x
            Exit For
        End If
    Next

    Return retval
End Function
 
پہلے ہم نے کوڈ کو سہل ترین بنانے کے چکر میں ایک ایج کنڈیشن کو فراموش کر دیا تھا، اسے درست کر دیا ہے۔ :) :) :)
 

mohdumar

محفلین
اسکو ڈی لنک کر دیں اور صرف اسپیس کو استعمال کریں۔

space گلف والا کوڈ تو کام نہیں کر رہا۔ مطلب 'کر<space>سن' کے درمیان کرننگ نہیں ہورہی۔
تاہم 'space' کو اگر کسی اور گلف سے تبدیل کیا جائے جیسے 'کز' تو کرکزسن' میں مکمل کرننگ ہوجاتی ہے۔ کہیں اوپن ٹائپ انجن سپیس کو سپیشل کیریکٹر تو نہیں مانتا۔؟
 

arifkarim

معطل
space گلف والا کوڈ تو کام نہیں کر رہا۔ مطلب 'کر<space>سن' کے درمیان کرننگ نہیں ہورہی۔
تاہم 'space' کو اگر کسی اور گلف سے تبدیل کیا جائے جیسے 'کز' تو کرکزسن' میں مکمل کرننگ ہوجاتی ہے۔ کہیں اوپن ٹائپ انجن سپیس کو سپیشل کیریکٹر تو نہیں مانتا۔؟
یہ کوڈ میرے پاس تو کام کر رہا ہے:
کوڈ:
DEF_LOOKUP "kern_1" PROCESS_BASE PROCESS_MARKS ALL DIRECTION RTL
IN_CONTEXT
LEFT GLYPH "kr"
RIGHT GLYPH "sn"
END_CONTEXT
AS_POSITION
ADJUST_SINGLE GLYPH "space" BY POS ADV -100 END_POS
END_ADJUST
END_POSITION
END

اور اسکی ویژن انٹرپریٹیشن:
b650.gif
 
مدیر کی آخری تدوین:

mohdumar

محفلین
پچھلی پوسٹس میں ہم نے ایک چیز ظاہر نہیں کی تھی کہ سب تجربوں کی سکرین شاٹ 1.2GHz پروسیسر سپیڈ پر لی گئی ہیں۔ دراصل ہمارے لیپ ٹاپ میں اوور ہیٹنگ کا مسئلہ آیا ہوا ہے اس لئے ہم پروسیسر کی فیکٹری سیٹنگ 3،33GHZ کی بجائے 1.2GHzکی ٹھنڈی سپیڈ پر گزارا کر رہے ہیں۔
ابھی ابن سعید بھائی کی حالیہ تجاویز پر عمل کیا اور اپنی طرف سے ایسا کیا کہ لگیچرز امیج سے ناکارہ عمودی فاصلہ (جس میں کوئی سیاہ پکسل نہیں تھا) نکال دیے۔ اس کے بعدچند سیکنڈ کے لئے 2,4GHz سپیڈ پر تجربہ کیا گیا تو کچھ اس طرح کا منظر سامنے آیا:
LsROsEj.png
 

arifkarim

معطل
پچھلی پوسٹس میں ہم نے ایک چیز ظاہر نہیں کی تھی کہ سب تجربوں کی سکرین شاٹ 1.2GHz پروسیسر سپیڈ پر لی گئی ہیں۔ دراصل ہمارے لیپ ٹاپ میں اوور ہیٹنگ کا مسئلہ آیا ہوا ہے اس لئے ہم پروسیسر کی فیکٹری سیٹنگ 3،33GHZ کی بجائے 1.2GHzکی ٹھنڈی سپیڈ پر گزارا کر رہے ہیں۔
ارے واہ! اتنے کم پروسیسر پر یہ پروسیسنگ اسپیڈ ہے تو فُل پرفارمنس پر کیا کرتا ہوگا! :)
 
پچھلی پوسٹس میں ہم نے ایک چیز ظاہر نہیں کی تھی کہ سب تجربوں کی سکرین شاٹ 1.2GHz پروسیسر سپیڈ پر لی گئی ہیں۔ دراصل ہمارے لیپ ٹاپ میں اوور ہیٹنگ کا مسئلہ آیا ہوا ہے اس لئے ہم پروسیسر کی فیکٹری سیٹنگ 3،33GHZ کی بجائے 1.2GHzکی ٹھنڈی سپیڈ پر گزارا کر رہے ہیں۔
ابھی ابن سعید بھائی کی حالیہ تجاویز پر عمل کیا اور اپنی طرف سے ایسا کیا کہ لگیچرز امیج سے ناکارہ عمودی فاصلہ (جس میں کوئی سیاہ پکسل نہیں تھا) نکال دیے۔ اس کے بعدچند سیکنڈ کے لئے 2,4GHz سپیڈ پر تجربہ کیا گیا تو کچھ اس طرح کا منظر سامنے آیا:
LsROsEj.png
اگر آپ ہر پئیر کی پروسیسنگ کے بعد یہ لاگ انفارمیشن کنسول پر پرنٹ کراتے ہیں تو غالباً پروسیسنگ اسپیڈ بڑھانے کا ایک اور طریقہ ہے وہ یہ کہ اس قسم کی لاگنگ کنسول (اسٹینڈرڈ آؤٹ) پر کرنے کے بجائے کسی لاگ فائل میں کریں، یا کمانڈ رن کرتے ہوئے اس کا اؤٹ پٹ کسی فائل میں ری ڈائریکٹ کر دیں۔ ونڈوز کے بارے میں ہم کچھ زیادہ نہیں کہہ سکتے، البتہ لینکس میں اسٹینڈرڈ آؤٹ پر کچھ پرنٹ کیا جائے تو وہ ہر نیو لائن کیریکٹر کے بعد آؤٹ بٹ کو فلش کر دیتا ہے، جبکہ فائل رائٹنگ کی صورت میں ڈیٹا کی بفرنگ ہوتی ہے اور ایک مخصوص مقدار میں لکھنے کو ڈیٹا جمع ہو جائے تبھی ان کو فائل میں لکھا جاتا ہے۔ اس عمل سے خاطر خواہ اسپیڈ اپ مل سکتا ہے کیونکہ بار بار اسٹینڈرڈ آؤٹ والی کانٹیکسٹ سوئچنگ نہیں ہو گی اور اس کی رینڈرنگ میں وقت ضائع نہیں ہوگا۔ :) :) :)
 

mohdumar

محفلین
انتہائی پرمزاح۔ :)
غالباً پروسیسنگ اسپیڈ بڑھانے کا ایک اور طریقہ ہے وہ یہ کہ اس قسم کی لاگنگ کنسول (اسٹینڈرڈ آؤٹ) پر کرنے کے بجائے کسی لاگ فائل میں کریں، یا کمانڈ رن کرتے ہوئے اس کا اؤٹ پٹ کسی فائل میں ری ڈائریکٹ کر دیں۔
اسی وجہ سے ہم نے نیو لائن کی بجائے سادہ 'کیرج ریٹرن' سے کام چلایا ہوا ہے۔ ویسے آوٹ پٹ ،فائل کی طرف ڈایریکٹ کر دی جائے تو پروگرام خاموش سا ہو جاتا ہے، جو ہمیں بالکل ھضم نہیں ہوتا۔
 
اسی وجہ سے ہم نے نیو لائن کی بجائے سادہ 'کیرج ریٹرن' سے کام چلایا ہوا ہے۔ ویسے آوٹ پٹ ،فائل کی طرف ڈایریکٹ کر دی جائے تو پروگرام خاموش سا ہو جاتا ہے، جو ہمیں بالکل ھضم نہیں ہوتا۔
ہمارا نہیں خیال کہ لائن فیڈ کے بجائے فقط کیرج ریٹرن استعمال کرنے سے بفرنگ ہونے لگے گی، بہر کیف آپ کو ونڈوز کے بارے میں بہتر علم ہوگا۔ آؤٹ پٹ کسی فائل کی طرف ریڈائریکٹ کرنے کے بعد پروگرام خاموش سا ضرور ہو جاتا ہے لیکن اس کا یہ مطلب نہیں کہ آپ اس کی پروگریس نہیں دیکھ سکتے۔ لینکس میں اس کام کے لیے درج ذیل کمانڈ موجود ہے:
کوڈ:
$ tail -f output.log
یعنی لاگ فائل کو ایک علیحدہ ٹرمنل میں مذکورہ بالا کمانڈ سے کھولنے پر اس کی آخری سطور اسٹریم ہونے لگتی ہیں اور جیسے جیسے لاگ فائل میں کچھ نیا شامل ہوتا ہے، وہ نظر آتا رہتا ہے۔ غالباً ونڈوز میں بھی اس کا متبادل موجود ہے:
کوڈ:
> Get-Content output.log –Wait
:) :) :)
 

mohdumar

محفلین
عارف بھائی مستقبل کا لاحیہ عمل طے کریں۔ کچھ سوالات۔۔۔
۱) کیا نعیم سعید ہی کی لسٹ کو پروسیس کرنا ہے۔
۲)سنگل ایڈجسٹمنٹ بہتر آپشن لگ رہا ہے۔ ہزاروں لگیچرز پیئرز کی پروسیسنگ کے بعد کیا ہزاروں ٹیبل امپورٹ ہوں گے۔ گروپنگ کا عمل سمجھا دیجئے۔
۳)ان ٹیبلز کے ساتھ ساتھ کیا سپیس کے لئے ہزاروں ٹیبل مزید بنائے جائیں گے۔

سب محفلینز کے لئے ایک جامع تحریر اس لڑی میں پوسٹ کر دیں۔بلاشبہ ہمیں افاقہ ہوگا۔:)
 

نبیل

تکنیکی معاون
یہ جو ایگزیکیوشن ٹائم کی بار بار بات ہو رہی ہے تو کیا یہ کوئی اتنا criticalفیکٹر ہے؟ اگر کچھ منٹ بھی پراسیسنگ میں لگتے ہیں تو میرے خیال میں قابل قبول ہونا چاہیے۔ البتہ اگر معاملہ گھنٹوں کا ہو تو آپٹمائزیشن پر سوچ بچار ضرور کرنی چاہیے۔
 

دوست

محفلین
یہ کوئی بڑا مسئلہ نہیں ہے۔ کوڈ آپٹمائزیشن کی اہمیت اپنی جگہ تاہم یہ گھنٹے بھی لے تو کام کو مختلف کمپیوٹروں پر تقسیم کیا جا سکتا ہے۔ مثلاً پروگرام اور ان پٹ کا ایک حصہ مجھے فراہم کر دیا جائے تو پروسیسنگ کے بعد آؤٹ پٹ یہاں فراہم کر سکتا ہوں۔ میرا سسٹم کافی ہیوی ڈیوٹی تو نہیں لیکن امید ہے کہ ایک دو گھنٹے پروسیسنگ کر ہی سکتا ہے (فورتھ جنریشن انٹیل 1.7 گیگا ہرٹز ڈوئل کور/ 2.4 گیگا ہرٹز سنگل کور زیادہ سے زیادہ سپیڈ)۔
 

mohdumar

محفلین
یہ جو ایگزیکیوشن ٹائم کی بار بار بات ہو رہی ہے تو کیا یہ کوئی اتنا criticalفیکٹر ہے؟ اگر کچھ منٹ بھی پراسیسنگ میں لگتے ہیں تو میرے خیال میں قابل قبول ہونا چاہیے۔ البتہ اگر معاملہ گھنٹوں کا ہو تو آپٹمائزیشن پر سوچ بچار ضرور کرنی چاہیے۔
جی اب ہمرے خیال میں اتنی سپیڈ حاصل ہو گئی ہے کہ عملی نتائج کے لئے پروسیسنگ پر لگا دیا جائے اور اگر پروسیسنگ parameters غلط بھی ہو جائیں نتیجتا پروسیسنگ دوبارہ کرنی پڑھے تو وقت کا اتنا ضیاع نہ ہوگا۔
 

arifkarim

معطل
۱) کیا نعیم سعید ہی کی لسٹ کو پروسیس کرنا ہے۔
نعیم سعید بھائی اگر کنفرم کر دیتے ہیں کہ انکی فراہم کر دہ لسٹ جامع اور مکمل ہے تومیرے خیال میں اسی کو بنیاد بنا لیتے ہیں۔
اس لسٹ میں جو الفاظ ہیں انہیں پراسیس کرنے سے قبل انکا جمیل نوری نستعلیق میں موجود تمام ترسیموں کیساتھ موازنہ کرنا ہوگا اور جن الفاظ میں یہ ترسیمے موجود نہ ہوں انہیں پراسیس کرنے کی ضرورت نہیں۔

)سنگل ایڈجسٹمنٹ بہتر آپشن لگ رہا ہے۔ ہزاروں لگیچرز پیئرز کی پروسیسنگ کے بعد کیا ہزاروں ٹیبل امپورٹ ہوں گے۔ گروپنگ کا عمل سمجھا دیجئے۔
سنگل ایڈجسٹمنٹ اسپیس کیساتھ گروپ کرننگ کیلئے یقیناً بہتر ہے البتہ الفاظ کے اندر کرننگ کیلئے موذوں نہیں ہے۔ میرے خیال میں ہمیں پہلے پیئر ایڈجسٹمنٹ ہی پر کام کرنا چاہیے اور اگر یہ کسی وجہ سے کمپائل نہ ہوتو پھر سنگل ایڈجسٹمنٹ پر کام کیا جائے۔
گروپنگ کا عمل میں کئی بار تفصیلاً سابقہ دھاگوں میں بیان کر چکا ہوں۔ ایک بار پھر:
  • سب سے پہلے ان الفاظ کی فہرست بنا لیں جن میں صرف ایک ہی کرننگ پیئر آ رہا ہے جیسا: ترکی، جرمنی، در وغیرہ۔
  • اب ان الفاظ کو پراسیس کریں جن میں دو پیئرز ہیں جیسے: پاکستان، بھارت، روس وغیرہ۔
  • ان سے حاصل شدہ پیئرز کی دو فہرستیں بنا لیں۔ پہلی میں وہ پیئرز جو پہلے آ رہے ہیں جیسے پاکستا، بھار، رو اور دوسری میں وہ جو بعد میں آرہے ہیں جیسے کستان، رت، وس۔
  • اب ان الفاظ کو پراسیس کریں جن میں تین پیئرز ہیں جیسے: اسرائیل، اردن، برازیل
  • ان سے حاصل شدہ پیئرز کی تین فہرستیں بنا لیں۔ پہلی میں وہ پیئرز جو پہلے نمبر پر ہیں: اس، ار، برا۔ دوسری میں وہ جو دوسرے پر ہیں: سرا، رد، از۔ جبکہ تیسری میں وہ جو تیسرے نمبر پر ہیں: ائیل، دن، زیل
  • اسی طرح تمام الفاظ کو پراسیس کر لینے کے بعد حاصل شدہ پہلے نمبر کی فہرستوں کو ایک ہی کالم میں ڈال کر ڈپلیکیٹ حذف کردیں۔ اب اس لسٹ کو اپنے اطلاقیہ سے پراسیس کروا لیں۔ انکا وولٹ ٹیبل جنریٹ کریں اور فانٹ میں امپورٹ کر کے کمپائل کر لیں۔
  • نتائج چیک کریں اور اگر کوئی مسئلہ ہو تو اس سے آگاہ کر دیں۔
  • جب یہاں تک کام ہو جائے پھر آگے پر بات کر لیں گے :)

)ان ٹیبلز کے ساتھ ساتھ کیا سپیس کے لئے ہزاروں ٹیبل مزید بنائے جائیں گے۔
اسپیس کیساتھ کرننگ بعد کا مسئلہ کا ہے۔ فی الوقت الفاظ کے اندر کرننگ پر توجہ دیں :)
 
آخری تدوین:
Top