Код при помощи которого я заработал(а) денег
givemethemoney;
не понял, объясни подробнее =)
куски кода из коммерческих проектов, по желанию их описать
Проект domestico.ca предыдущая версия сайта. Длительность 4ре месяца. Язык пхп.
Код главной страницы.
<?
define ('PATH_TO_ROOT', './');
define ('PAGE_CODE', 'home');
require_once(PATH_TO_ROOT . 'inc/init.inc.php');
require_once(PATH_TO_ROOT . 'inc/module.inc.php');
class SingleFile extends Module {
function SingleFile {
global $db, $this_page;
$titles = array ("eng" => 'Domestico.ca - home',
"fra" => 'Domestico.ca - acceuil');
Module::Module($db, $this_page, $titles);
}
function Proceed {
$this->Top;
$this->Central;
$this->Bottom;
}
function Central {
$tpl = new Template;
$tpl->set_file('main', $this->path_to_templates . 'home.ihtml');
$this->PrepareTemplate($tpl);
$tpl->pparse('OUT', 'main', false);
}
function GetMenu(&$menu) {
$menu[1][7] = MENU_CHECKED;
}
function Work {
}
}
$m = new SingleFile;
$m->Proceed;
?>
class Discussion < ActiveRecord::Base
belongs_to :discussion_folder
belongs_to :user
end
def self.check_attribute(*attr_names)
attr_names.each do |attr_name|
class_eval %{def check_#{attr_name}
@user = User.new(:#{attr_name} => request.raw_post)
@user.valid?
render :partial => '#{attr_name}'
end}
end
end
Хотя это говнокусочек, завтра его переделаю обязательно.
Проект лучший машграф 2004 года на ВМК
заработал 1000 рублей
![](/images/graemlins/grin.gif)
clouds.psh
// c0 psConstVec (0.0, 0.5, 1.0, 0.75)
// c1 cloud0PerturbationFactor
// c2 cloud0Color
// c3 cloud1PerturbationFactor
// c4 cloud1Color
// c5 background0Color
// c6 background1Color
ps.1.4
texld r0, t1
texld r1, t3
texcrd r2.rgb, t0
texcrd r3.rgb, t2
mad r0.rgb, c1, r0_bx2, r2
mad r1.rgb, c3, r1_bx2, r3
phase
texld r0, r0
texld r1, r1
texcrd r2.rgb, t4
mul_x2_sat r4.rgb, r0.a, c2
+mul r4.a, r0.a, c2.a
mul_x2_sat r3.rgb, r1.a, c4
+mul r3.a, r1.a, c4.a
lrp r0.rgb, r0.a, r4, r3
+add_sat r0.a, r3.a, r4.a
lrp r2, r2.y, c5, c6
lrp_sat r0, r0.a, r0, r2
clouds.vsh
//clouds vertex shaderРезультат
// v0 - Vertex Position
// v7 - Vertex Texture Data u,v
// c0 - time vector
// c4-7 - Composite World-View-Projection Matrix
vs.1.1
dcl_position v0
dcl_texcoord v7
m4x4 oPos, v0, c4 //transformed position
frc r0.xy, c0.x //tex coords + time (1st set)
add oT0.xy, v7, r0
add oT1.xy, v7, -r0
mov r0.x, -c0.y //tex coords + time (2nd set)
mov r0.y, c0.y
frc r0.xy, r0
add oT2.xy, v7, r0
add oT3.xy, v7, -r0
mov oT4, v7 //original tex coord
![](/user/upload/file132257.jpg)
Какой-то не руби кусок.
![](/images/graemlins/grin.gif)
Чёрт, подправил бы что-то, но историю не перепишешь. Что есть, то есть
![](/images/graemlins/cool.gif)
for($a=0; $a<$nn; $a++)
{
// Комментарии - не код
$m_cur=&$m_new_boards_data[$a];
if($a>0)
$t_sql_a1.=",";
$t_sql_a1.="('$bag_uid','".$m_cur['uid']."','".$m_cur['hash_id']."','1','$c_time')";
// комментарии - не код
$t_p1="('$bag_uid','".$m_cur['uid']."','0','";
for($b=0; $b<12; $b++)
{
if($a>0 || $b>0)
$t_sql_a2.=",";
$t_sql_a2.=$t_p1.($m_cur['month'][$b])."','".($m_cur['def_st'][$b])."','".($m_cur['prix'][$b])."','".($m_cur['prix0'][$b])."')";
}
}
////////
int CF_FIRST::ms(UINT z_msg, WPARAM wpr, LPARAM lpr)
{
int xpos,ypos,c;
if(z_msg==WM_LBUTTONDOWN)
{
xpos=LOWORD(lpr);
ypos=HIWORD(lpr);
if(r_s1.is_in_key(xpos,ypos
return 1704;
if(r_s2.is_in_key(xpos,ypos
return 1705;
}
if(z_msg==WM_MOUSEMOVE)
{
xpos=LOWORD(lpr);
ypos=HIWORD(lpr);
if(r_s1.is_in_key(xpos,ypos) || r_s2.is_in_key(xpos,ypos
SetCursor(LoadCursor(NULL,IDC_HAND;
else
SetCursor(LoadCursor(NULL,DEF_CURSOR;
}
if(z_msg==WM_SIZE)
return 1799;
return 0;
}
///////
void CF_FIRST::ds
{
if(z_status==1)
{
r_s1.ds; r_s2.ds;
//r_e3.ds; r_e4.ds;
tpic.ds;
z_status=0;
}
}
public void run
{
#OCCRetryCount
Counter progressTotal;
;
ttsbegin;
ledgerJournalTable = LedgerJournalTable::find(ledgerJournalId);
ledgerJournalName = ledgerJournalTable.ledgerJournalName;
if (inTransfer)
{
inTransfer = false;
}
else
{
if (! this.validate
{
throw error(strfmt("@SYS21512", "@SYS23471";
}
if (! ledgerJournalTable.checkNotSystemBlocked ||
! ledgerJournalTable.checkNotGroupBlocked ||
! ledgerJournalTable.checkNotUserBlocked
{
throw error(strfmt("@SYS21512", "@SYS23471";
}
this.updateSystemBlock(true);
}
ttscommit;
try
{
numOfVouchersBooked = 0;
progressTotal = voucherNum ? 1 : ledgerJournalTable.numOfVouchers;
if (progressTotal)
{
if (ledgerJournalEngine)
{
ledgerJournalEngine.clearErrorLog;
}
if (! post)
{
if (!progress)
{
this.progressInit("@SYS13894", progressTotal, #AviFindFile);
progress.setText("@SYS26577");
}
this.checkJournal;
}
else
{
ttsbegin;
this.progressInit("@SYS25781", progressTotal, #AviFormLetter);
progress.setText("@SYS26577");
if (! this.postJournal
{
if (transferErrors)
{
inTransfer = true;
ttsabort;
}
else
{
throw error("@SYS21628");
}
}
else
{
if (numOfVouchersBooked)
{
ledgerJournalTable = LedgerJournalTable::find(ledgerJournalId, true);
if (ledgerJournalEngine)
{
ledgerJournalTable.JournalTotalDebit = ledgerJournalEngine.journalDebit;
ledgerJournalTable.JournalTotalCredit = ledgerJournalEngine.journalCredit;
ledgerJournalTable.JournalTotalOffsetBalance = ledgerJournalEngine.journalOffsetBalance;
}
else
{
[ledgerJournalTable.JournalTotalDebit,
ledgerJournalTable.JournalTotalCredit,
ledgerJournalTable.JournalTotalOffsetBalance] = LedgerJournalTable::journalBalanceMST(ledgerJournalId);
}
this.ledgerTransferToJournal(ledgerJournalId);
if (ledgerJournalTable.RemoveLineAfterPosting)
{
LedgerJournalTrans::deleteLineAfterPosting(ledgerJournalId);
this.moveTransferredBack;
}
if (!errorJournalDeleted)
{
ledgerJournalTable.Posted = NoYes::Yes;
ledgerJournalTable.PostedDate = systemdateget;
if (this.transferErrors
ledgerJournalTable.Log = strfmt("@SYS53324", this.numOfErrorsInList errorLedgerJournalId);
}
ledgerJournalTable.update;
TransactionLog::create(TransactionLogType::LedgerJournal, ledgerJournalTable.JournalNum + ' ' + ledgerJournalTable.Name);
}
ttscommit;
this.interCompanyTransferToCustPayment;
}
}
}
else
{
info("@SYS27671");
}
if (!inTransfer || (this.numOfVouchersBooked <= 0)
{
this.updateSystemBlock(false);
}
progress = null;
}
catch (Exception::Deadlock)
{
retry;
}
catch (Exception::UpdateConflict)
{
if (appl.ttsLevel == 0)
{
if (xSession::currentRetryCount >= #RetryNum)
{
throw Exception::UpdateConflictNotRecovered;
}
else
{
retry;
}
}
else
{
throw Exception::UpdateConflict;
}
}
catch (Exception::Error)
{
this.updateSystemBlock(false);
}
}
![](/images/graemlins/laugh.gif)
Можно, конечно, переписать как-нибудь так:
def self.check_attribute(*attr_names)Но мне так меньше нравится.
attr_names.each do |attr_name|
class_eval check_attribute_template(attr_name)
end
end
def self.check_attribute_template(attr_name)
%{def check_#{attr_name}
@user = User.new(:#{attr_name} => request.raw_post)
@user.valid?
render :partial => '#{attr_name}'
end}
end
STAN_F stan_create(char *s, char *vars)
{
int i, j, changes, itmp;
double dtmp;
char *t1 = vars;
char *t2;
__stan_varnames = malloc(sizeof(char *;
#ifdef __DEBUG
printf(":%s:\n", vars);
#endif
i = 0; j = 0;
while(t1[i]) i++;
t2 = malloci + 1) * sizeof(char;
while(*t1)
{
while(!(isalnum(*t1) || *t1 == '_') && *t1)
t1++;
i = 0;
while(isalnum(*t1) || *t1 == '_')
{
t2[i] = *t1++;
i++;
}
t2[i] = 0;
i++;
__stan_varnames = realloc(__stan_varnames, (j + 1) * sizeof(char *;
__stan_varnames[j] = malloci + 1) * sizeof(char;
#ifdef __DEBUG
printf("var[%d] = %s\n", j, t2);
#endif
strcpy(__stan_varnames[j], t2);
j++;
}
free(t2);
__stan_total++;
__stan_tps = realloc(__stan_tps, (__stan_total + 1) * sizeof(int *;
__stan_vls = realloc(__stan_vls, (__stan_total + 1) * sizeof(double *;
__stan_tps[__stan_total] = (int *)malloc(sizeof(int;
__stan_vls[__stan_total] = (double *)malloc(sizeof(double;
__stan_tps_sp = -1;
__stan_vls_sp = -1;
__stan_sp = __stan_total;
__stan_totalvars = realloc(__stan_totalvars, __stan_sp + 1);
__stan_totalvars[__stan_sp] = j;
i = 0;
while(s[i]) i++;
__stan_ptr = s;
__stan_t = malloci + 1) * sizeof(char;
__stan_gettoken;
__stan_level1;
__stan_tps_push(0);
free(__stan_t);
for(i = 0; i < __stan_totalvars[__stan_sp]; i++)
free(__stan_varnames[i]);
free(__stan_varnames);
// __stan_fpu = realloc(__stan_fpu, (__stan_total + 1) * sizeof(double *;
// __stan_fpu_sp = realloc(__stan_fpu_sp, (__stan_total + 1) * sizeof(int;
// __stan_fpu[__stan_total] = (double *)malloc__stan_vls_sp + 1) * sizeof(double
// __stan_fpu_sp[__stan_total] = -1;
#ifdef __DEBUG
printf("\ntps stack:");
for(i = 0; i <= __stan_tps_sp; i++) printf(" %d", __stan_tps[__stan_sp][i]);
printf("\nvls stack:");
for(i = 0; i <= __stan_vls_sp; i++) printf(" %g", __stan_vls[__stan_sp][i]);
printf("\n");
#endif
// optimizing (calculating all we can calculate)
do {
changes = 0;
// ...NV+N+... -> ...NN+V+... and ...NV*N*... -> ...NN*V*... optimization
j = 0;
for(i = 0; i <= __stan_tps_sp - 4; i++)
{
if(__stan_tps[__stan_sp][i] > 0)
j++;
if(__stan_tps[__stan_sp][i] == __STAN_NUM)
{
if(__stan_tps[__stan_sp][i + 1] > 0)
if__stan_tps[__stan_sp][i + 2] == __STAN_ADD &&
__stan_tps[__stan_sp][i + 4] == __STAN_ADD) ||
(__stan_tps[__stan_sp][i + 2] == __STAN_MUL &&
__stan_tps[__stan_sp][i + 4] == __STAN_MUL
if(__stan_tps[__stan_sp][i + 3] == __STAN_NUM)
{
itmp = __stan_tps[__stan_sp][i + 3];
__stan_tps[__stan_sp][i + 3] = __stan_tps[__stan_sp][i + 1];
__stan_tps[__stan_sp][i + 1] = itmp;
dtmp = __stan_vls[__stan_sp][j + 2];
__stan_vls[__stan_sp][j + 2] = __stan_vls[__stan_sp][j + 1];
__stan_vls[__stan_sp][j + 1] = dtmp;
changes++;
}
j++;
}
}
// ...N [unary op]... -> ...N [nop]... optimization
j = 0;
for(i = 0; i <= __stan_tps_sp - 1; i++)
{
if(__stan_tps[__stan_sp][i] > 0)
j++;
if(__stan_tps[__stan_sp][i] == __STAN_NUM)
{
if(__stan_tps[__stan_sp][i + 1] < __STAN_SINGLE)
{
__stan_fpu_push(__stan_vls[__stan_sp][j]);
__stan_fpu_op(__stan_tps[__stan_sp][i + 1]);
#ifdef __DEBUG
// printf("%g, [%d]\n", __stan_vls[__stan_sp][j], __stan_vls[__stan_sp][j + 1]);
#endif
__stan_vls[__stan_sp][j] = __stan_fpu_pop;
__stan_tps[__stan_sp][i + 1] = __STAN_NOP;
i++;
changes++;
}
j++;
}
}
// ...NN [double op]... -> ...N [nop] [nop]... optimization
j = 0;
for(i = 0; i <= __stan_tps_sp - 2; i++)
{
if(__stan_tps[__stan_sp][i] > 0)
j++;
if(__stan_tps[__stan_sp][i] == __STAN_NUM)
{
if(__stan_tps[__stan_sp][i + 1] == __STAN_NUM)
if(__stan_tps[__stan_sp][i + 2] > __STAN_SINGLE &&
__stan_tps[__stan_sp][i + 2] < __STAN_DOUBLE)
{
__stan_fpu_push(__stan_vls[__stan_sp][j]);
__stan_fpu_push(__stan_vls[__stan_sp][j + 1]);
__stan_fpu_op(__stan_tps[__stan_sp][i + 2]);
#ifdef __DEBUG
printf("%g, %g, [%d] = ", __stan_vls[__stan_sp][j], __stan_vls[__stan_sp][j + 1], __stan_tps[__stan_sp][i + 2]);
#endif
__stan_vls[__stan_sp][j] = __stan_fpu_pop;
__stan_tps[__stan_sp][i + 1] = __STAN_NOP_NUM;
__stan_tps[__stan_sp][i + 2] = __STAN_NOP;
i++; i++;
j++;
changes++;
}
j++;
}
}
#ifdef __DEBUG
printf("changes: %d\n", changes);
#endif
__stan_compress_stacks;
} while(changes != 0);
#ifdef __DEBUG
printf("\nafter optimization:\ntps stack:");
for(i = 0; i <= __stan_tps_sp; i++) printf(" %d", __stan_tps[__stan_sp][i]);
printf("\nvls stack:");
for(i = 0; i <= __stan_vls_sp; i++) printf(" %g", __stan_vls[__stan_sp][i]);
printf("\n");
#endif
return __stan_sp;
}
![](/images/graemlins/laugh.gif)
бля я то думал тока мои прогеры так криво писать умеют
![](/images/graemlins/grin.gif)
![](/images/graemlins/grin.gif)
Вот тебе ещё кусок
![](/images/graemlins/cool.gif)
///////////////////////////////////////
m_glabal_desc:
[0] - идентификатор знака
[1] - иконка знака
[2] - основной приоритет знака при расстановке в экзаменах
[3] - имя катринки, показываемой в обучении
[4] - имя невыделенной картинки в экзамене
[5] - имя выделенной картинки в экзамене
[6] - x координата смещения большой картинки в обучении
[7] - x координата смещения большой картинки в экзамене
[8] - ширина иконки
[9] - высота иконки
m_target_desc:
[0] - id
[1] - имя файла с картинкой мишени
[2] - x - логическая координата центра мишени (то есть, смещение от л.в. угла)
[3] - y - координата
m_smart_desc:
[0] - id
[1] - id в массиве m_global_desc
[2] - имя файла-иконки
[3] - id мишени
[4] - x смещение логического центра картинки относительно мишени
[5] - y смещение -//-
m_static_pict:
[0] - id
[1] - id "мишени" (0 - если таковой нет)
[2] - имя большой картинки, появляющейся в обучении при наведении мышки
[3] - x смещение большой картинки в обучении
[4] - адрес, по которому надо переходить в случае клика ('' - не используется)
[5] - тип перехода (1-в текущем окне)
[6] - alt-поле картинки
использование в макете страницы
m_page:
[0] - id конкретного вида знака (то есть, m_smart_desc)
[1] - х координата логического центра
[2] - y координата логического центра
[3] - число шагов, за которое картинка дойдет до места
[4] - пауза перед движением иконки, в шагах
[5] - пауза после движения иконки, в шагах
[6] - общий приоритер
[7] - локальная группа расстановки
[8] - приоритет в локальной группе расстановки
base_pic_x,
base_pic_y,
base_pic_name
/////////////////////////////////////
*/
// Массив для вычисления позиций, на которых будут находиться
// движущиеся иконки в начале движения.
// Hумерация привязана к $m_global_desc
$m_left_map[0]=array(0,0,0,0);
function pre_calc($m_local)
{
global $m_global_desc,$m_smart_desc,$m_left_map;
global $base_pic_x, $base_pic_y;
// Инициализация массива учёта используемых типов знаков.
for($a=0; $a<20; $a++)
{ $tt_ico[$a]=0; $m_left_map[$a]=array($a,0,0,0);}
// цикл расчёта типов знаков, которые нужно будет расставлять
$n=count($m_local);
for($a=1; $a<$n; $a++)
{
$t_id = $m_local[$a][0]; // id знака, который появится после движения
$t_uid = $m_global_desc[$m_smart_desc[$t_id][1]][0]; // id знака
// учитываем количесто расставленных знаков данного типа
$tt_ico[$t_uid]++;
}
for($a=1, $ty=$base_pic_y+10; $a<20; $a++)
{
if($tt_ico[$a]!=0) // Если данный тип знака используется
{
// tx, ty - координаты знака в исходной позиции
$tx = $base_pic_x + (40-$m_global_desc[$a][8])/2;
$t_name = $m_global_desc[$a][1];
// Сохраняем координаты, откуда будет начинаться движение
$m_left_map[$a][3]=$tt_ico[$a];
$m_left_map[$a][1]=$tx;
$m_left_map[$a][2]=$ty;
$ty = $ty+$m_global_desc[$a][9]+5;
}
}
}
///////////////////
// Генерирование кода, опеделяющего картинки в своем начальном
// и конечном местоположениях
// вид кода
// <img name='icores_2' src='pics/red.gif' border=0
// style='visibility: visible; position: absolute; top: 110; left: 200'
// onMouseOver='r_over(1)' onMouseOut='r_out'>
//
// $cur_task=1 - режим "обучение"
// $cur_task=2 - режим "экзамен"
function print_ico_base($m_local,$cur_task,$m_local_stat,&$m_rast)
{
global $base_pic_x, $base_pic_y, $base_pic_name;
global $m_global_desc,$m_smart_desc,$m_target_desc,$m_left_map,$m_static_pict;
global $m_rast_desc;
$main_x=$base_pic_x;
$main_y=$base_pic_y;
if(@count($m_rast)==0)
$m_rast[0]=array(0,0,0);
if($n_mls=@count($m_local_stat $n_mls=$n_mls-1;
else $n_mls=0;
// Вывод основной картинки, на которой будут расставляться знаки
printf("<img name='base_pic' border='0' src='%s' style='visibility: visible; position: absolute; left: %d; top: %d'>\n",$base_pic_name,$main_x,$main_y);
// цикл генерирования карты конечного расположения иконок
$n=count($m_local);
for($a=1; $a<$n; $a++)
{
$t_id = $m_local[$a][0]; // id знака, который появится после движения
$t_uid = $m_global_desc[$m_smart_desc[$t_id][1]][0]; // id знака
// полные координаты верхнего левого угла картинки-результата
$tx = $m_local[$a][1] + $main_x - $m_smart_desc[$t_id][4];
$ty = $m_local[$a][2] + $main_y - $m_smart_desc[$t_id][5];
// имя файла картинки-результата
$t_name = $m_smart_desc[$t_id][2];
// выводим определения картинок-знаков в позиции, куда они придут.
if($cur_task==1) printf("<img name='iconres_%d' border='0' src='%s' style='visibility: hidden; position: absolute; left: %d; top: %d' onMouseOver='r_over(%d)' onMouseOut='r_out'>\n",$a,$t_name,$tx,$ty,$t_uid);
if($cur_task==2) printf("<img name='iconres_%d' border='0' src='%s' style='visibility: hidden; position: absolute; left: %d; top: %d'>\n",$a,$t_name,$tx,$ty);
// расстановка мишеней в экзамене
if($cur_task==2)
{
$t_targ = $m_smart_desc[$t_id][3];
$t_prior1= $m_global_desc[$t_uid][2];
$t_pgroup= get_corr1($m_local[$a][6]);
$t_prior2= get_corr1($m_local[$a][7]);
$tx = $m_local[$a][1] + $main_x - $m_target_desc[$t_targ][2];
$ty = $m_local[$a][2] + $main_y - $m_target_desc[$t_targ][3];
$t_name = $m_target_desc[$t_targ][1];
printf("<img name='target_%d' border='0' src='%s' alt='место для знака, сигналиста или петарды' style='visibility: visible; position: absolute; left: %d; top: %d' onClick='put_sign(%d,0)'>\n",$a,$t_name,$tx,$ty,$a);
}
}
// цикл генерирования карты расстояний в экзамене
$n=count($m_rast);
for($a=1; $a<$n; $a++)
{
if($cur_task==2)
{
$t_id=$a; // id расстояния, который появится после движения
$t_uid = $m_rast_desc[$m_rast[$t_id][0]][0]; // id знака
// полные координаты верхнего левого угла картинки-результата
$tx = $m_rast[$a][1] + $main_x - $m_rast_desc[$t_uid][3];
$ty = $m_rast[$a][2] + $main_y - $m_rast_desc[$t_uid][4];
// имя файла картинки-результата
$t_name = $m_rast_desc[$t_uid][2];
// выводим определения картинок-знаков в позиции, куда они придут.
printf("<img name='rast_%d' border='0' src='%s' style='visibility: hidden; position: absolute; left: %d; top: %d'>\n",$a,$t_name,$tx,$ty);
// расстановка мишеней
$tx = $m_rast[$a][1] + $main_x - 7;
$ty = $m_rast[$a][2] + $main_y - 4;
$t_name = 'pics/
Чего-то пока никто не зажег, написав код на каком-нибудь не-mainstream языке. Ждем-с.
![](/images/graemlins/smile.gif)
SqlDataReader dr = cmd.ExecuteReader;
if(dr.HasRows)
{
grid.DataSource = dr;
grid.DataBind;
}
if(grid.Rows.Count > 0)
{
Infragistics.WebUI.UltraWebGrid.UltraGridRow rw = grid.Rows[0];
for(int i=0;i<dr.FieldCount;i++)
{
if(rw.Cells[i].Value is DateTime)
{
grid.Columns[i].Format="dd.MM.yy HH:mm";
grid.Columns[i].DataType="System.DateTime";
}
}
}
/* КАКОЙ ОСЕЛ ПИСАЛ ВОТ ЭТО?!?!?!? МЛИА!?
dr.Close;
dr = cmd.ExecuteReader;
if(dr.Read
{
for(int i=0;i<dr.FieldCount;i++)
{
if(dr[i] is DateTime)
{
grid.Columns.FromKey(dr.GetName(i.Format="dd.MM.yy HH:mm";
grid.Columns.FromKey(dr.GetName(i.DataType="System.DateTime";
}
}
}
}*/
UltraWebToolbar1.Items.FromKeyButton("Hide").Enabled=dr.HasRows;
UltraWebToolbar1.Items.FromKeyButton("UnHideAll").Enabled=dr.HasRows;
UltraWebToolbar1.Items.FromKeyButton("Ascending").Enabled=dr.HasRows;
UltraWebToolbar1.Items.FromKeyButton("Descending").Enabled=dr.HasRows;
dr.Close;
cmd.CommandText="tc_getTimePeriodUserProfile";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Clear;
cmd.Parameters.Add("@UserID",Session["HDNameNowID"]);
dr = cmd.ExecuteReader;
UltraWebToolbar1.Items.FromKeyButton("TimeFilter").Enabled=dr.HasRows;
Я хренею с вашего кода, господа.
![](/images/graemlins/laugh.gif)
![](/images/graemlins/wink.gif)
ибо не хуй расслабляться.
![](/images/graemlins/smile.gif)
Но он какой-то маленький. По нему сложно оценить весь проект.
# Case insensitive dictionary definition
def lower_key(meth):
def wrapper(self, key, *args, **kwds):
try: key= key.lower
except AttributeError: pass
return meth(self, key, *args, **kwds)
return wrapper
class cidict(dict):
"""Case insensitive dictionary."""
def __init__(self, dic= **kwds):
super(cidict, self).__init__
try: dic= dic.iteritems
except AttributeError:
try: dic= dic.items
except AttributeError: pass
for k,v in dic: self[k]= v
for k,v in kwds.iteritems: self[k]= v
for _meth in ('__setitem__', '__getitem__', '__delitem__',
'get', 'has_key', 'setdefault', '__contains__'):
setattr(cidict, _meth, lower_key(getattr(dict, _meth
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:Template="tc:template">
<xsl:output method="html" indent="yes"/>
<xsl:template match="Template:Root/Template:Base">
<table border="0" cellpadding="0" cellspacing="2" width="100%">
<xsl:for-each select="Template:Items/Template:Item">
<xsl:if test="position mod 2 = 1">
<xsl:text disable-output-escaping="yes"><tr></xsl:text>
</xsl:if>
<td>
<table>
<tr>
<td width="180" class="teaserTitle">
<a>
<xsl:attribute name="href">
<xsl:value-of select="@url"/>
</xsl:attribute>
<xsl:attribute name="title">
<xsl:value-of select="@title"/>
</xsl:attribute>
<xsl:value-of select="@title"/>
</a>
</td>
</tr>
<xsl:call-template name="Items">
<xsl:with-param name="node" select="Template:Items"/>
</xsl:call-template>
<tr>
<td>
<img height="5" width="1" src="./images/empty.gif" alt=" "/>
</td>
</tr>
</table>
</td>
<xsl:if test="position mod 2 = 1">
<td width="10">
<img height="1" width="10" src="./images/empty.gif" alt=" "/>
</td>
</xsl:if>
<xsl:if test="position mod 2 = 0">
<xsl:text disable-output-escaping="yes"></tr>
</xsl:text>
</xsl:if>
</xsl:for-each>
<xsl:if test="count(Template:Items/Template:Item) mod 2 = 1">
<td>
</td>
<xsl:text disable-output-escaping="yes"></tr>
</xsl:text>
</xsl:if>
</table>
</xsl:template>
<xsl:template name="Items">
<xsl:param name="node"/>
<tr>
<td width="180">
<xsl:for-each select="$node/Template:Item">
<span class="microNaviPassiv">
<a target="_blank">
<xsl:attribute name="href">
<xsl:value-of select="@url"/>
</xsl:attribute>
<xsl:attribute name="title">
<xsl:value-of select="@title"/>
</xsl:attribute>
<xsl:value-of select="@title"/>
</a>
</span>
<br/>
</xsl:for-each>
</td>
</tr>
</xsl:template>
</xsl:stylesheet>
Говнокусочек вообще отличный, между прочим.
Код трушный, кстати.
Говнокусочек вообще отличный, между прочим.Поверю тебе на слово.
![](/images/graemlins/smile.gif)
Если не умеешь писать код, то можешь попробовать поучить других, как писать код. Или поруководить теми, кто пишет код. Это относится и к 'у в том числе.
Для того, чтобы написать красивый стройный код, много мозгов не нужно, и опыта много не нужно, но только это будет академический код. Если же реализовывается не какой-нибудь алгоритм/численный метод, а идёт банальная работа с внешними данными, например со сложными структурами или БД (как в большинстве приведённых крупных кусках кода то такой элегантности добиться очень трудно, так как эти самые и структуры данных, структура/органицазия БД обычно довольно сильно меняются. В результате код превращается в кашу, которую конечно нужно рефакторить, но...
1) код работает, а есть и другие задачи, которыми нужно заниматься
2) с большой вероятностью что-нибудь ещё изменится, и придётся переделывать ещё раз
Достали теоретики/манагеры, которые сами никогда ничего большого не писали, но зато знают, за что нужно бить/отрывать руки/штрафовать. Собсвенно, о том что именно в этом русле обсуждение пойдёт, было очевидно с первого поста.
то такой элегантности добиться очень трудно, так как эти самые и структуры данных, структура/органицазия БД обычно довольно сильно меняются. В результате код превращается в кашу, которую конечно нужно рефакторить, но...Т.е. ты вот тут утверждаешь, что люди, которые пишут в своих книгах про то, как им удается поддерживать гибкость, "красоту", стройность и элегантность кода (имеются ввиду авторы вроде Фаулера, Бека, pragmatic programmers, 37signals откровенно пиздят?
1) код работает, а есть и другие задачи, которыми нужно заниматься
2) с большой вероятностью что-нибудь ещё изменится, и придётся переделывать ещё раз
![](/images/graemlins/smile.gif)
Т.е. ты вот тут утверждаешь, что люди, которые пишут в своих книгах про то, как им удается поддерживать гибкость, "красоту", стройность и элегантность кода (имеются ввиду авторы вроде Фаулера, Бека, pragmatic programmers, 37signals откровенно пиздят?Ну не "откровенно пиздят", а "слегка приукрашивают"
![](/images/graemlins/smile.gif)
Да и это вполне возможно, поддерживать элегантность кода, только затраты на поддержание этой элегантности очень большие, в разы больше. Иногда это оправдано, иногда нет - возможно, авторы работали с теми проектами, где это действительно нужно. Но лично я работал там, где в этом необходимости просто нет, и это неоправданная роскошь - поэтому и код соответствующий.
Есть же условное правило, что на 90% ресурсов тратятся на 10% кода - вот, можно составить условное правило, что на 10% кода нужно затратить 90% сил по поддержанию элегантности
![](/images/graemlins/smile.gif)
у меня неделю назад был случай, когда человек ушел в отпуск, а до этого всем клиентам обновили версию софта . так вот в одном критическом месте он умудрился захардкодить коннекш стринг. в результате неделя работы специалиста по обновлению пошла на хуй. а все изза такого кода.
что на 10% кода нужно затратить 90% сил по поддержанию элегантностинет просто надо иногда думать, что с тобой в команде могут работать люди.
и тут должен присутствовать принцип: незаменимых людей быть не должно, что когда другой человек полезет исправлять твой код потратил хотябы 90 процентов сил а не 200
![](/images/graemlins/wink.gif)
Дело не в оформлении, а в том, что некоторые люди называют code smell.
Однако уже неоднократно замечал, что если в какой-то момент перестать следить за элегантностью (не очень удачный термин, имхо
![](/images/graemlins/smile.gif)
В последнем проекте (на Ruby которым я сейчас занимаюсь, пока у меня вполне получается поддерживать элегантность, а времени на это уходит по моим ощущениям, не сильно много (чему сильно способствует мега-фреймворк Rails). Посмотрим, что будет дальше
![](/images/graemlins/laugh.gif)
""" Print scenario
Copyright 2005 SIA "ANK"
Preview report.
"""
"""History (most recent first):
18-Dec-2005 [Ss] Fix printing
27-Nov-2005 [Ss] Call own Start/EndScenario
02-Oct-2005 [Ss] Fix bad code (using pylint warnings)
18-Aug-2005 [Ss] Change input parameters
28-Jul-2005 [Ss] Add Close Event
13-Jul-2005 [Ss] Print all inpyt tables in some oreder
13-Jul-2005 [Ss] Now printing works
12-Jul-2005 [Ss] Change forms layout - does not work yet
20-Jun-2005 [Ss] Pages now from 1 to 1
19-Jun-2005 [Ss] Now it works on win32
17-Jun-2005 [phd] Use self.info.
13-Jun-2005 [Ss] Remove component classes
11-Jun-2005 [bor] Remove get_cell get_value get_list
10-Jun-2005 [bor] Remove get_index
10-Jun-2005 [phd] No need to store parent_frame.
08-Jun-2005 [phd] Added Subversion keywords. Added __all__.
08-Jun-2005 [Ss] Adapted for a more generic Scenario framework.
06-jun-2005 [Ss] now it works with new resources
09-may-2005 [Ss] fixed print error. Now can print into PostScript file
08-may-2005 [Ss] added log attribute
07-may-2005 [Ss, Cube] created
"""
__version__ = "$Revision: 1194 $"[11:-2]
__date__ = "$Date: 2006-02-01 14:28:33 +0300 (Wed, 01 Feb 2006) $"[7:-2]
__revision__ = "$Id: PrintPreview.py 1194 2006-02-01 11:28:33Z phd $"[5:-2]
__all__ = ["PrintPreview"]
import wx
from Scenario import Scenario
import log
page_min, page_max = page_from, page_to = 1, 1
class PrintPreview(Scenario):
""" Print script"""
def __init__(self, window, **data):
super(PrintPreview, self).__init__(window, **data)
pages = self.data['pages']
self.preview_printout = PlatePrintout('Preview', pages)
self.printout = PlatePrintout('toPrint', pages)
self.preview = wx.PrintPreview(
self.preview_printout, self.printout
)
self.frame = wx.PreviewFrame(
self.preview, window, 'Preview report'
)
self.frame.Initialize
wx.EVT_CLOSE(self.frame, self.OnClose)
self.info('Started')
self.frame.Show(True)
def OnClose(self, event):
self.info('Closed')
self.EndScenario
event.Skip
class PlatePrintout(wx.Printout, log.Log):
""" preveiw and print Printout """
def __init__(self, name, tables):
wx.Printout.__init__(self, name)
self.tables = tables
self.info('Create printout')
self.pages = 4
def OnBeginDocument(self, start_page, end_page):
self.info('print from %d to %d'%(start_page, end_page
_state = wx.Printout.base_OnBeginDocument(self,
start_page, end_page
)
return _state
def OnPrintPage(self, current_page):
self.dc = self.GetDC
_font = self.dc.GetFont
_font.SetPointSize(14)
self.dc.SetFont(_font)
self.y_offset = 0
y_pos = 0
page = 1
self.dc.StartPage
for table in self.tables:
y_pos, page = table.fit(self.dc, y_pos, page,
current_page, self.IsPreview
)
self.dc.EndPage
self.pages = page
self.info('Redraw event called page %d'%current_page)
return True
def HasPage(self, page):
return page <= self.pages
у меня неделю назад был случай, когда человек ушел в отпуск, а до этого всем клиентам обновили версию софта . так вот в одном критическом месте он умудрился захардкодить коннекш стринг. в результате неделя работы специалиста по обновлению пошла на хуй. а все изза такого кода.т.е. у вас релиз не проходит тестирование перед развертыванием у заказчика? или неправильная организация тестирования?
Да, программист виноват, не поставил TODO: или поставил, но забыл пофиксить, но программист это человек и как любой человек он ошибается. Причем здесь идет речь об ошибке, которая гарантированно отлавливается при правильном процессе тестирования. Если вы экономите на тестировании, то вы сознательно идете на риск, поэтому ответственность за последствия таких ошибок в бОльшей степени лежит на менеджере, чем на программисте.
Если не умеешь писать код, то можешь попробовать поучить других, как писать код. Или поруководить теми, кто пишет код. Это относится и к 'у в том числе.Хм, а ко мне-то это каким боком относится? Я пока своего кода сюда не писал. Принесу с работы что-нибудь эдакое.
Для того, чтобы написать красивый стройный код, много мозгов не нужно, и опыта много не нужно, но только это будет академический код.
Про мозги и опыт согласен, надо просто аккуратным быть, а вот про академичность - ерунда. Идёт работа с внешними данными? Отлично! Локализуй её в отдельном модуле/классе, и тогда при переходе на другую БД придётся менять только этот модуль, а остальной код не надо будет трогать ВООБЩЕ. Я так (конкретно для работы с разными БД) делал и на плюсах и на пхп. Если ты такого не делаешь, а пишешь код, максимально зависимый от конкретной версии бд - ну блин, сам дурак, проектирование плохое.
2Завхоз - нет, я как раз про оформление. В плохо оформленном коде сложно разбираться. В том числе и автору кода, скажем, через полгода после написания этого кода. Функции должны быть короткими, названия переменных - осмысленными, в коде - отступы и т.д. Ботать Мейерса. Я сначала сам долго не мог понять, нахер это нужно, если код рабочий? Но, к счастью, мой начальник за полгода сумел в меня это вбить. И я прозрел. Хороший код писать совсем не сложно. А вот ресурсы (в том числе временные) на его поддержку, как правильно заметил Мэдкроз, будут намного меньше.
Достали теоретики/манагеры, которые сами никогда ничего большого не писали, но зато знают, за что нужно бить/отрывать руки/штрафовать.
Скорее, достали теоретики, которые ничего большого не писали, а говорят о том, как сложно писать хороший код и как правильно писать плохой код. Ибо если бы эти теоретики писали что-нибудь реально большое, они бы поняли, как важно хорошее оформление кода.
+1
Про мозги и опыт согласен, надо просто аккуратным быть, а вот про академичность - ерунда. Идёт работа с внешними данными? Отлично! Локализуй её в отдельном модуле/классе, и тогда при переходе на другую БД придётся менять только этот модуль, а остальной код не надо будет трогать ВООБЩЕ. Я так (конкретно для работы с разными БД) делал и на плюсах и на пхп. Если ты такого не делаешь, а пишешь код, максимально зависимый от конкретной версии бд - ну блин, сам дурак, проектирование плохое.И что в этом хорошего? каждое обращение к базе ты обернул в языковые конструкции пхп или плюсов, объем кода явно увеличился, что почти всегда плохо. А раде чего, чтобы была переносимость на разные СУБД, а в большинстве случаев перенос не нужен никому.
Вон посмотри (пост -а выше) как классно выглядит код на Axapta-е, все в одном месте и обычные операторы языка и обращение к базе select. У Axapta есть переносимость между Oracle и SQL Server-ом, но эта переносимость реализована на уровне языка, а у тебя проблема переносимости влияет на организацию кода.
И что в этом хорошего? каждое обращение к базе ты обернул в языковые конструкции пхп или плюсов, объем кода явно увеличилсяЕсли у тебя десятки модулей, которые использую БД, объём кода явно уменьшается и у него улучшаются и читабельность и поддерживаемость. И вовсе не в переносимости дело. Я просто как пример привёл БД. Когда в множестве разных модулей пишутся огромные куски почти одинакового кода, это очень плохое проектирование.
И вовсе не в переносимости дело.
я это и хотел сказать
![](/images/graemlins/smile.gif)
т.е. у вас релиз не проходит тестирование перед развертыванием у заказчика? или неправильная организация тестирования?
...
гг
плюсик
правда, у нас из-за тестера совсем упала личная дисциплина. в некотором роде.
из-за того, что заказчик посадил на наш проект своего тестера и приказал заниматься только нами.
Мы обленились до того, что даже не проверяем, а ошибки/эксепшены после правки кода есть или нет (код на питоне, соответственно, все в рантайме).
Если есть - их найдут - тогда и будем об этом думать =)
#include "AlwaysChecker.h"
// возвращает истину
bool AlwaysChecker::isTimeToSave
{
return true;
}
bool AlwaysChecker::isTimeToChange;
Не могу найти код, за который я получил денег.
Суди не свыше сапога.
configXML.onLoad = function
{
var node = this.firstChild;
while (node)
{
if (node.nodeName == "config")
{
var sub_node = node.firstChild;
while (sub_node)
{
if (sub_node.nodeName == "timeout")
timeout = sub_node.firstChild.nodeValue;
else if (sub_node.nodeName == "stoptimeout")
stoptimeout = sub_node.firstChild.nodeValue;
else if (sub_node.nodeName == "category")
category = sub_node.firstChild.nodeValue;
else if (sub_node.nodeName == "codebase")
codebase = sub_node.firstChild.nodeValue;
else if (sub_node.nodeName == "requesturi")
requesturi = sub_node.firstChild.nodeValue;
else if (sub_node.nodeName == "catbase")
catbase = sub_node.firstChild.nodeValue;
else if (sub_node.nodeName == "namebase")
namebase = sub_node.firstChild.nodeValue;
else if (sub_node.nodeName == "statbase")
statbase = sub_node.firstChild.nodeValue;
else if (sub_node.nodeName == "bgpic")
bgpic = sub_node.firstChild.nodeValue;
tF.text += sub_node.nodeName + "=" + sub_node.firstChild.nodeValue + "\n";
sub_node = sub_node.nextSibling;
}
break;
}
node = node.nextSibling;
}
LC.connect (name);
LC.send (slaveName + name, "configInit", namebase, statbase, bgpic);
tF.text += namebase + ", " + statbase + ", " + bgpic;
}
![](/user/upload/file3834.png)
( + еще кусок немного больше)
if (sub_node.nodeName == "timeout")
timeout = sub_node.firstChild.nodeValue;
else if (sub_node.nodeName == "stoptimeout")
stoptimeout = sub_node.firstChild.nodeValue;
else if (sub_node.nodeName == "category")
category = sub_node.firstChild.nodeValue;
else if (sub_node.nodeName == "codebase")
codebase = sub_node.firstChild.nodeValue;
else if (sub_node.nodeName == "requesturi")
requesturi = sub_node.firstChild.nodeValue;
else if (sub_node.nodeName == "catbase")
catbase = sub_node.firstChild.nodeValue;
else if (sub_node.nodeName == "namebase")
namebase = sub_node.firstChild.nodeValue;
else if (sub_node.nodeName == "statbase")
statbase = sub_node.firstChild.nodeValue;
else if (sub_node.nodeName == "bgpic")
bgpic = sub_node.firstChild.nodeValue;
Там циклов и массивов не бывает чтоле?
Cross Group = "OI","CrossDataPostalCode",ZIP,Addon,Dlocality
Cross Group = "CSZ","CrossDataPostalCode",ZIP,Dlocality
Cross Group = "CSZ","CrossDataPostalCode",ZIP,City,County
Cross Group = "CSZ","CrossDataPostalCode",ZIP,City
Cross Group = "CSZ","CrossDataPostalCode",ZIP,County
Cross Group = "CSZ","CrossDataCB",CityCB,CountyCB
Cross Group = "CSZ","CrossDataCB",CityCB
Ctx Group = 1key,inward
Ctx Group = 1key
Ctx Group = 0,RulesPostalCodeWeights,key,inward
Answer Fields = key,inward
Answer Tables = OI,Street,DStreet,Apt
Reject Class = CAdsIRejFinal
Street Number=
{=
dynamic=0
reject=0
tables=Street,DStreet,Apt
DbVocName=
elem=
{=
interp={"Low>=,High<="}
}=
}=
Street=
{=
tables=Street,DStreet,Apt
dynamic=1
reject=0
DbVocName=
allow nonvoc=0
elem=
{=
control=NSAContextCtrl
tables=Street,Apt
out={"street_name","",""}
out={"street_name","",", "}{"street_suff","",""}
inp={"Street Number","Low>=,High<="}
interp={"street_name="}{"street_suff="}
}=
elem=
{=
control=NSAContextCtrl
tables=DStreet,Apt
out={"dstreet_name","",""}
out={"dstreet_name","",", "}{"dstreet_suff","",""}
inp={"Street Number","Low>=,High<="}
interp={"dstreet_name="}{"dstreet_suff="}
}=
}=
чего?
Срочный двухнедельный проект. Погашение кредитов через банкоматы Сбербанка.
В прошлом году на заработанные деньги съездил с девушкой на море на пару недель.
Функция, вытаскивающая данные о сумме задложенности из системы. Система работает в отделениях Сбера уже более 10 лет. Для более-менее комфортной работы пришлось сделать к этой ней фасадик.
Некоторые коменты не мои.
Дебаг проходил не без бубна.
BANK_FILL_BY_LS_RESULT Sofia::FillAccountByLs(Account *account)
{
if (!Connect return BANK_FILL_BY_LS_NO_ACCESS;
char buff[1024];
opr_o;
opr_o_l(bank);
opr_o_s(user);
sprintf
char*)buff,"SELECT R_DOG.A_NUM, R_DOG.A_NLS_KR, NR_WID_LS_I.A_NAME FROM "
"R_DOG,R_LS_NUMBER,NR_WID_LS_I WHERE R_DOG.A_NLS_KR=R_LS_NUMBER.A_NLS AND "
"R_DOG.A_SNVKL=NR_WID_LS_I.A_NUM AND R_LS_NUMBER.A_NUMBER_NLS='%s'",
account->accountNumber.ToString.c_str
);
opr_o_cchar*)buff);
opr_send(OP_DYN_SMPL);
long ret = 0;
long lNomLSKr;
long lNomDog;
char ucNaimKred[256];
for (lNomLSKr=0; opr_i; )
{
opr_i_l(&ret);
if (!ret)
{
opr_i_l(&lNomDog); // Номер договора
opr_i_l(&lNomLSKr); // системный номер ссудного ЛС
opr_i_cchar*)ucNaimKred); // наименование вида кредита
}
}
if (ret != RET_NO_DATA)
{
logger.Log(LL_Error, "Sofia: no data returned");
return BANK_FILL_BY_LS_NO_ACCESS;
}
if (!lNomLSKr)
{
logger.Log(LL_Info, "Sofia: account not found");
return BANK_FILL_BY_LS_LS_NOT_FOUND;
}
// Насчет погашения ссудной задолженности на удаленных терминалах (работать должна только для новой схемы реализации кредитов,
// SignProcFromDenis из WorkParam == 1, работа без т.н. "соплательщиков", а насчет штрафа - репу чесать надо)
// Запрашиваем состояние кредитного договора:
short sCalcProcVbsForMixCase = 3;
long servDate;
short time1;
today_time(&servDate, &time1);
opr_o;
opr_o_l(this->bank);
opr_o_s(this->user);
opr_o_l(lNomDog); // это номер договора
opr_o_l(servDate); // это дата, на которую надо дать инфо по ссуде (текущая дата)
opr_o_s(KRED_FZ); // дефайн - типа кредиты физлиц
opr_o_s(sCalcProcVbsForMixCase); // различные схемы учета просроченных процентов на внебалансе, я беру ее из ini-файла, но тут можно упростить
opr_send(CR_ASK_LS_KRED); // из op_cred.h
opr_i;
opr_i_l(&ret);
if (ret != RET_NORMAL)
{
logger.Log(LL_Error, "Sofia: CR_ASK_LS_KRED returned error");
return BANK_FILL_BY_LS_CR_ASK_LS_KRED_ERROR;
}
// ****************************************************************************************************************
// Receiving results
// ****************************************************************************************************************
short sSchema; // признак разнесенности просроченных %% на внебалансе, ежели тут 0 - в операции отказать
long lDateEndActKr; // дата последнего действия по ЛС ОД ссуды (а по барабану, ежели эта дата не больше, чем текущая дата)
long lStatusKr; // статус ЛС кредита (ну ежели он KR_CLOSE, ничего не надо пытаться делать, да и не получится)
long lSysNomLSKr; // системный номер ЛС ОД
double dSaldoKr; // остаток ОД
double dProcToday; // %% по ОД
double dSaldoProsrOD; // ну и так далее и тому подобное
double dPennyProsrOD;
double dSaldoProsrProc;
double dPennyProsrProc;
double dPennyUnGetOD;
double dPennyRashOD;
double dSumGetKred;
double dSaldoSpisKred;
double dSaldoProcOrder;
double dProsrSaldoVbs;
double dSrochSaldoVbs;
double dPennyProcOrder;
double dPennyProcVBS;
double dDolgODIntoProsr; // инфо о готовящейся просрочке ОД (это по барабану)
double dDolgProcIntoProsr; // инфо о готовящейся просрочке %% (это по барабану)
long lFilialKred;
long lDateLastPogOD;
double dSumLastPogOD;
long lDateNextPogProc;
double dSumNextPogProc;
long lDateNextPogOD;
double dSumNextPogOD;
char ucFIOKr[128]; // вот это нименование ссудозаемщика (а может и ЛС, не помню но сейчас это практикуется как идентичные вещи
char ucAddrKr[128]; // это его адрес
double dSaldoSpisProc;
short sAmountSoPlat; // это информация о "соплательщиках", ежели не 0 - в операции отказать
char ucNaimSoPlat[128];
double dSoPlProcToday;
double dSoPlProcOrderBS;
double dSoPlProcOrderVBS;
double dSoPlProsrProcBS;
double dSoPlProsrProcVBS;
double dProcShtraf; // это инфо о размере штрафа за не своевременное погашение ОД
double dShtraf; // это инфо о реальной величине штрафа на текущую дату. Внимание! Это значение д.б. отрицательным! Ежели не так - в операции - отказать
opr_i_s(&sSchema); // признак разнесенности просроченных %% на внебалансе, ежели тут 0 - в операции отказать
opr_i_l(&lDateEndActKr); // дата последнего действия по ЛС ОД ссуды (а по барабану, ежели эта дата не больше, чем текущая дата)
opr_i_l(&lStatusKr); // статус ЛС кредита (ну ежели он KR_CLOSE, ничего не надо пытаться делать, да и не получится)
opr_i_l(&lSysNomLSKr); // системный номер ЛС ОД
opr_i_m(&dSaldoKr); // остаток ОД
opr_i_m(&dProcToday); // %% по ОД
opr_i_m(&dSaldoProsrOD); // ну и так далее и тому подобное
opr_i_m(&dPennyProsrOD);
opr_i_m(&dSaldoProsrProc);
opr_i_m(&dPennyProsrProc);
opr_i_m(&dPennyUnGetOD);
opr_i_m(&dPennyRashOD);
opr_i_m(&dSumGetKred);
opr_i_m(&dSaldoSpisKred);
opr_i_m(&dSaldoProcOrder);
opr_i_m(&dProsrSaldoVbs);
opr_i_m(&dSrochSaldoVbs);
opr_i_m(&dPennyProcOrder);
opr_i_m(&dPennyProcVBS);
opr_i_m(&dDolgODIntoProsr); // инфо о готовящейся просрочке ОД (это по барабану)
opr_i_m(&dDolgProcIntoProsr); // инфо о готовящейся просрочке %% (это по барабану)
opr_i_l(&lFilialKred);
opr_i_l(&lDateLastPogOD);
opr_i_m(&dSumLastPogOD);
opr_i_l(&lDateNextPogProc);
opr_i_m(&dSumNextPogProc);
opr_i_l(&lDateNextPogOD);
opr_i_m(&dSumNextPogOD);
opr_i_cchar*)ucFIOKr); // вот это нименование ссудозаемщика (а может и ЛС, не помню но сейчас это практикуется как идентичные вещи
opr_i_cchar*)ucAddrKr); // это его адрес
opr_i_m(&dSaldoSpisProc);
opr_i_s(&sAmountSoPlat); // это
![](/images/graemlins/smile.gif)
кусок, h-файл, который написался быстрее всего, но срр-шник, где он используется, компилится почти минуту
#ifndef __FDSPARSER_H__
#define __FDSPARSER_H__
#include <boost/spirit.hpp>
#include <boost/spirit/phoenix.hpp>
using namespace boost::spirit;
using namespace phoenix;
#include <iostream>
using std::ostream;
struct obst
{
enum type
{
OBST,
TRNX,
TRNY,
TRNZ,
GRID,
PDIM
};
double cc,pc;
double x1,y1,z1,x2,y2,z2;
double xbar0,xbar,ybar0,ybar,zbar0,zbar;
int ibar,jbar,kbar;
type t;
bool add;
};
ostream &operator << (ostream &os, const obst &o);
struct fds_parser_closure : public boost::spirit::closure<fds_parser_closure,obst>
{
member1 o;
};
struct fds_parser : public grammar<fds_parser,fds_parser_closure::context_t>
{
template <class ScannerT>
struct definition
{
typedef rule<ScannerT> rule_t;
rule_t main_rule;
rule_t shit;
definition(const fds_parser &self)
{
main_rule =
ch_p('&') >>
(
(
str_p("OBST")[bind(&obst::addself.o)=true,bind(&obst::tself.o)=obst::OBST] >>
str_p("XB") >> str_p("=") >>
real_p[bind(&obst::x1self.o)=arg1] >> ',' >>
real_p[bind(&obst::x2self.o)=arg1] >> ',' >>
real_p[bind(&obst::y1self.o)=arg1] >> ',' >>
real_p[bind(&obst::y2self.o)=arg1] >> ',' >>
real_p[bind(&obst::z1self.o)=arg1] >> ',' >>
real_p[bind(&obst::z2self.o)=arg1] >> shit
)
|
(
str_p("GRID")[bind(&obst::addself.o)=true,bind(&obst::tself.o)=obst::GRID] >>
*(
( str_p("IBAR") >> ch_p('=') >> int_p[bind(&obst::ibarself.o)=arg1] ) |
( str_p("JBAR") >> ch_p('=') >> int_p[bind(&obst::jbarself.o)=arg1] ) |
( str_p("KBAR") >> ch_p('=') >> int_p[bind(&obst::kbarself.o)=arg1] ) |
ch_p(',')
)
)
|
(
str_p("PDIM")[bind(&obst::addself.o)=true,bind(&obst::tself.o)=obst::PDIM] >>
*(
( str_p("XBAR0") >> ch_p('=') >> real_p[bind(&obst::xbar0self.o)=arg1] ) |
( str_p("XBAR") >> ch_p('=') >> real_p[bind(&obst::xbarself.o)=arg1] ) |
( str_p("YBAR0") >> ch_p('=') >> real_p[bind(&obst::ybar0self.o)=arg1] ) |
( str_p("YBAR") >> ch_p('=') >> real_p[bind(&obst::ybarself.o)=arg1] ) |
( str_p("ZBAR0") >> ch_p('=') >> real_p[bind(&obst::zbar0self.o)=arg1] ) |
( str_p("ZBAR") >> ch_p('=') >> real_p[bind(&obst::zbarself.o)=arg1] ) |
ch_p(',')
)
)
|
(
(
str_p("TRNX")[bind(&obst::addself.o)=true,bind(&obst::tself.o)=obst::TRNX] |
str_p("TRNY")[bind(&obst::addself.o)=true,bind(&obst::tself.o)=obst::TRNY] |
str_p("TRNZ")[bind(&obst::addself.o)=true,bind(&obst::tself.o)=obst::TRNZ]
)
>>
*(
( str_p("CC") >> ch_p('=') >> real_p[bind(&obst::ccself.o)=arg1] )
|
( str_p("PC") >> ch_p('=') >> real_p[bind(&obst::pcself.o)=arg1] )
|
ch_p(',')
)
)
|
(
shit[bind(&obst::addself.o)=false]
)
) >> ch_p('/') >> *(anychar_p - '&');
shit = *(
(
anychar_p - ( ch_p('\'') | ch_p('/') )
)
|
(
ch_p('\'') >>
*(
anychar_p - ch_p('\'')
) >>
ch_p('\'')
)
);
}
const rule_t &start const
{
return main_rule;
}
};
};
#endif
будет опенсурс библиотекая бы побоялся ее использовать
![](/images/graemlins/wink.gif)
потому что код вообще нечитаемый поддерживать сложно будет. код с запашком
![](/images/graemlins/laugh.gif)
ну ваще это сложно очень на самом деле, рекурсивно двигаться по пикселям контура. я ваще опух это писать надо сказать... сам ща до конца не понимаю, как оно работает. Хеширование вчистую взял у Юрия Богатырева, толи на цитфоруме пример его, толи на опеннете.
================
if (m[x][y]==3 &&
m[x-1][y]==3 &&
m[x-1][y-1]==255 &&
m[x][y-1]==255 &&
m[x+1][y-1]==255 &&
m[x+1][y]==255 &&
m[x+1][y+1]==255 &&
m[x][y+1]==3 &&
m[x-1][y+1]==3)
================
Вообще, есть туча способов от них избавиться. Если значения этих массивов всегда в нужных случаях принимают значения или 3, или 255, то можно сначала отобразить этот квадрат в какую-нибудь переменную из 9-ти или 27 бит, например как
int sqr = 0;
if(m[x-1][y-1]==255) sqr ^= 0100000000;
if(m[x-1][y-1]==3 ) sqr ^= 0200000000;
if(m[x-1][y] ==255) sqr ^= 0010000000;
if(m[x-1][y] ==3 ) sqr ^= 0020000000;
....
потом проверять как
if(sqr == 0122122111)
{}
Нет, я никого ничему не учу, у меня у самого очень много недоработок в коде... Но вот такого я особенно не люблю
![](/images/graemlins/grin.gif)
PS: Что-то подсказывает мне, что вообще эту рекурсивную функцию можно строчек до 25-30 сократить
![](/images/graemlins/smile.gif)
Можно поподробнее постановку задачи?
вот тож самое на перле но работает страшно медленно, потому потребовалось переписать на сях... или по другому постановка задачи, обвести черно-белую фигуру. или например обвести и распознать букву, просто хочется поиметь такую библиотеку.
![](/user/upload/file132772.jpg)
да я в сях не ездец. когда либу допишу, чтобы она делала четко и без ошибок минимальный набор действий, тогда и патчи можно делать и улучшать и объяснение будет, как это работает и почему именно так, а не иначе. А пока прога вообще через пень колоду работает... разбираться надо. но хеширование вроде нормально работает.
это про вейвлет-анализ?
Буковка е мазовая. Для Internet Explorer ты рисовал логотип?
потому что код вообще нечитаемый поддерживать сложно будетВот! Твоими устами глаголет истина! Пока что в этом треде только я только говнокод вижу. Ну кроме мэдовского, конечно же.
Ну кроме мэдовского, конечно же.Ну, ещё бы.
![](/images/graemlins/laugh.gif)
> Вот! Твоими устами глаголет истина! Пока что в этом треде только я только говнокод вижу.
Разбавь бочку говна ложкой мёда, запости свой код. Только не 20 строчек, а более-менее большой кусок.
Да всё время забываю сделать это, когда на работе. Надеюсь, завтра выложу.
![](/images/graemlins/laugh.gif)
Реально работающий код, он хоть и не красив, зато работает быстро.
![](/images/graemlins/smile.gif)
![](/images/graemlins/laugh.gif)
У остальных восьми прогеров аналогичная точка зрения?
![](/images/graemlins/laugh.gif)
этих собак еще и учить приходиться
![](/images/graemlins/wink.gif)
хотя из восьми толковых только 3ое, остальные так НЕГРЫ! текучку кто разгребает
![](/images/graemlins/grin.gif)
Негры, потому что им такие задания достаются или потому что думать не хотят?
![](/images/graemlins/frown.gif)
![](/images/graemlins/smile.gif)
Оставить комментарий
laki
создадим?постим куски кода небольшие по желанию описываем проекты