(NET) NET (2016)

Проги під заказ і проги по натхненню.

Як і раніше, я іноді пишу десктопні проги під заказ. Наприклад у минулому році я написав дві такі проги під заказ - Конструктор PDF-схем. , Складська прога на WCF-сервісах зі сканером.. Таких прог багато, більшість з них я ніяк не описую тут на сайті, ось наприклад ще одна десктопна прога 2016-го року.

Десктопні проги я могу писати навіть безкоштовно, для власного задоволення. Нище ви можете побачити скріни проги, яку я написав для себе особисто, по натхненню, тобто безкоштовно.





Що ми можемо побачити на скрині вище? Головно вікно цієї проги зліва. На ньому можна задати фрилансерскі біржі, на яких потрібно шукати закази на програмування. У вікні по центру ви можете побачити мої спеціальності (перераховані по приорітету) - це 34 програмісткі спеціальності, з декількох тисяч існуючих. Класіфікатори існуючих спеціальностей програмістів розташовані справа, та справа знизу. Вони теж постійно поповнюються.

Задачі на програмування викачуються з фрілансерских бірж, класіфікуються і відображаються у единій таблічці, з якої дуже зручно віповідати замовнику.





І, як и завжди - я покажу якусь частку кода цієї проги - код форми відображення даних. Сама форма виглядає ось так:





А код цієї форми виглядає ось так:



   1:  Public Class CheckForm
   2:   
   3:      Dim db1 As ParserDBDataContext
   4:      Dim Projects As System.Collections.Generic.List(Of Freelancer.AllProject)
   5:      Dim TypeOfSort As Integer = 0
   6:      Dim MaxBids As Integer = 20
   7:      Dim MinSumm As Integer = 100
   8:   
   9:      Private Sub LoadForm_Load(sender As Object, e As System.EventArgs) Handles Me.Load
  10:          db1 = New ParserDBDataContext
  11:          Projects = (From X In db1.AllProjects Select X Order By X.ToMySkill, X.i Where X.Checked Is Nothing And X.BidCount < MaxBids And X.Summ >= MinSumm).ToList
  12:          RowCountToolStripLabel.Text = Projects.Count
  13:          DataGridView1.AutoGenerateColumns = False
  14:          DataGridView1.Columns(1).DataPropertyName = "Summ"
  15:          DataGridView1.Columns(2).DataPropertyName = "TimeType"
  16:          DataGridView1.Columns(3).DataPropertyName = "HourLeft"
  17:          DataGridView1.Columns(4).DataPropertyName = "BidCount"
  18:          DataGridView1.Columns(5).DataPropertyName = "Country"
  19:          DataGridView1.Columns(6).DataPropertyName = "Category"
  20:          DataGridView1.Columns(7).DataPropertyName = "Title"
  21:          DataGridView1.Columns(8).DataPropertyName = "TXT"
  22:          DataGridView1.DataSource = Projects
  23:      End Sub
  24:   
  25:      Private Sub DataGridView1_DataBindingComplete(sender As Object, e As System.Windows.Forms.DataGridViewBindingCompleteEventArgs) Handles DataGridView1.DataBindingComplete
  26:   
  27:          For i As Integer = 0 To Projects.Count - 1
  28:              DataGridView1.Rows(i).Cells(0).ToolTipText = Projects(i).i
  29:              DataGridView1.Rows(i).Cells(1).ToolTipText = Projects(i).Category
  30:              DataGridView1.Rows(i).Cells(2).ToolTipText = Projects(i).Category
  31:              DataGridView1.Rows(i).Cells(3).ToolTipText = Projects(i).Category
  32:              DataGridView1.Rows(i).Cells(4).ToolTipText = Projects(i).Category
  33:              DataGridView1.Rows(i).Cells(5).ToolTipText = Projects(i).Country
  34:              DataGridView1.Rows(i).Cells(6).ToolTipText = DataGridView1.Rows(i).Cells(5).Value
  35:              '
  36:              Dim Style1 = New DataGridViewCellStyle()
  37:              Dim Blue As Integer = CInt(DataGridView1.Rows(i).Cells(3).Value) * 10
  38:              If Blue > 255 Then Blue = 255
  39:              Style1.BackColor = Color.FromArgb(255, 255, Blue)
  40:              DataGridView1.Rows(i).Cells(3).Style = Style1
  41:              '
  42:              Dim Style2 = New DataGridViewCellStyle()
  43:              Dim Red As Integer = 350 - CInt(DataGridView1.Rows(i).Cells(1).Value)
  44:              If Red > 255 Then
  45:                  Red = 255
  46:              ElseIf Red < 0 Then
  47:                  Red = 0
  48:              End If
  49:              Style2.BackColor = Color.FromArgb(Red, 255, 255)
  50:              DataGridView1.Rows(i).Cells(1).Style = Style2
  51:              '
  52:              Dim Style3 = New DataGridViewCellStyle()
  53:              Dim Green As Integer = CInt(DataGridView1.Rows(i).Cells(4).Value) * 20
  54:              If Green > 255 Then Green = 255
  55:              Style3.BackColor = Color.FromArgb(255, Green, 255)
  56:              DataGridView1.Rows(i).Cells(4).Style = Style3
  57:              '
  58:              Dim Style4 = New DataGridViewCellStyle()
  59:              Dim Style41 = New DataGridViewCellStyle()
  60:              Style41.BackColor = Color.FromArgb(0, 255, 0)
  61:              Dim Style42 = New DataGridViewCellStyle()
  62:              Style42.BackColor = Color.FromArgb(0, 0, 255)
  63:              If Projects(i).ProjectType = 2 Then
  64:                  DataGridView1.Rows(i).Cells(0).Style = Style41
  65:              ElseIf Projects(i).ProjectType = 1 Then
  66:                  DataGridView1.Rows(i).Cells(0).Style = Style42
  67:              End If
  68:          Next
  69:      End Sub
  70:   
  71:   
  72:      Private Sub DataGridView1_CellContentDoubleClick(sender As System.Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellContentDoubleClick
  73:          If e.RowIndex >= 0 And e.ColumnIndex >= 6 Then
  74:              Process.Start(Projects(e.RowIndex).URL)
  75:          ElseIf e.RowIndex = -1 And e.ColumnIndex <= 6 Then
  76:              Rebind(e.ColumnIndex)
  77:          Else
  78:              ParsePage(e.RowIndex)
  79:          End If
  80:      End Sub
  81:   
  82:      Private Sub DelToolStripButton1_Click(sender As System.Object, e As System.EventArgs) Handles DelToolStripButton1.Click
  83:          For i As Integer = 0 To DataGridView1.Rows.Count - 1
  84:              Dim Check1 As Boolean = Convert.ToBoolean(CType(DataGridView1.Rows(i).Cells(0), DataGridViewCheckBoxCell).Value)
  85:              If Check1 Then
  86:                  Debug.Print(i)
  87:                  Dim DelNum As Integer = CInt(DataGridView1.Rows(i).Cells(0).ToolTipText)
  88:                  Dim DelOne = (From X In db1.AllProjects Select X Where X.i = DelNum).ToList
  89:                  If DelOne.Count > 0 Then
  90:                      DelOne(0).Checked = 1
  91:                      db1.SubmitChanges()
  92:                  End If
  93:              End If
  94:          Next
  95:          db1.SubmitChanges()
  96:          Rebind(TypeOfSort)
  97:          Exit Sub
  98:      End Sub
  99:   
 100:      Sub Rebind(ColumnIndex As Integer)
 101:          Dim CurCursor = Me.Cursor
 102:          Me.Cursor = Cursors.WaitCursor
 103:          Select Case ColumnIndex
 104:              Case 0
 105:                  Projects = (From X In db1.AllProjects Select X Order By X.ToMySkill, X.i Where X.Checked Is Nothing And X.BidCount < MaxBids And X.Summ >= MinSumm).ToList
 106:                  TypeOfSort = 0
 107:              Case 1
 108:                  Projects = (From X In db1.AllProjects Select X Order By X.Summ Where X.Checked Is Nothing And X.BidCount < MaxBids And X.Summ >= MinSumm).ToList
 109:                  TypeOfSort = 1
 110:              Case 2
 111:                  Projects = (From X In db1.AllProjects Select X Order By X.TimeType Where X.Checked Is Nothing And X.BidCount < MaxBids And X.Summ >= MinSumm).ToList
 112:                  TypeOfSort = 2
 113:              Case 3
 114:                  Projects = (From X In db1.AllProjects Select X Order By X.HourLeft Where X.Checked Is Nothing And X.BidCount < MaxBids And X.Summ >= MinSumm).ToList
 115:                  TypeOfSort = 3
 116:              Case 4
 117:                  Projects = (From X In db1.AllProjects Select X Order By X.BidCount Where X.Checked Is Nothing And X.BidCount < MaxBids And X.Summ >= MinSumm).ToList
 118:                  TypeOfSort = 4
 119:              Case 5
 120:                  Projects = (From X In db1.AllProjects Select X Order By X.Country Where X.Checked Is Nothing And X.BidCount < MaxBids And X.Summ >= MinSumm).ToList
 121:                  TypeOfSort = 5
 122:              Case 6
 123:                  Projects = (From X In db1.AllProjects Select X Order By X.Category Where X.Checked Is Nothing And X.BidCount < MaxBids And X.Summ >= MinSumm).ToList
 124:                  TypeOfSort = 6
 125:          End Select
 126:          DataGridView1.DataSource = Projects
 127:          RowCountToolStripLabel.Text = Projects.Count
 128:          Me.Cursor = CurCursor
 129:      End Sub
 130:   
 131:      Function ParseRestTime(One As String) As String
 132:          Dim Pos3 As Integer = One(8).ToString.IndexOf(">")
 133:          Dim Pos4 As Integer = One(8).ToString.IndexOf("<", Pos3)
 134:          Return One.Substring(Pos3, Pos4 - Pos3)
 135:      End Function
 136:   
 137:      Private Sub MaxBidsToolStripTextBox1_TextChanged(sender As Object, e As System.EventArgs) Handles MaxBidsToolStripTextBox1.TextChanged
 138:          If Integer.TryParse(MaxBidsToolStripTextBox1.Text, MaxBids) And Integer.TryParse(MinSummToolStripTextBox1.Text, MinSumm) Then
 139:              If DataGridView1.DataSource IsNot Nothing Then
 140:                  Rebind(TypeOfSort)
 141:              End If
 142:          End If
 143:      End Sub
 144:   
 145:      Private Sub MinSummToolStripTextBox1_TextChanged(sender As Object, e As System.EventArgs) Handles MinSummToolStripTextBox1.TextChanged
 146:          If Integer.TryParse(MaxBidsToolStripTextBox1.Text, MaxBids) And Integer.TryParse(MinSummToolStripTextBox1.Text, MinSumm) Then
 147:              If DataGridView1.DataSource IsNot Nothing Then
 148:                  Rebind(TypeOfSort)
 149:              End If
 150:          End If
 151:      End Sub
 152:   
 153:  End Class



Я опишу тут ще одну свою прогу, призначення якої було таке - побудувати віртуальний архів, бо я маю дуже багато відео-аудіо файлів, які зберігаютья у у разних місцях і у декількох єкземплярів. Для цих відео-аудіо я би хотів мати віртуальний архів, як я його називаю. Тобто один віруальний файл має две, чи може бути навіть три копії у різних місцях. Таким чином зайві копії можна почистити, якщо потрібно кудись поїхати, то легко знайти потрібний діск з даними. Також е величезна кількість якихось бекапів, фото, інсталяцій. Щоб швидко у цьому з'оріентуватися мені і була потрібна ця прога.

Вона працювала мабуть тиждень, поки не обійшла всі мої носії даних. Як ви можете побачити на скрінах, у мене знайшлося 1 мільон 363 тісячі 375 медіа файлів. По кожному з них потім я прогнав FFMPEG та записав результат у базу.

Зрозуміло, що всі ці файли зберігаються не на локальному кампутері, а у локальній мережі та десь у інтернеті. Доступ до своїх архівів у інтернеті я зробив приконекшивши архіви по FTP.



Якогось цікавого коду тут немає, але для навчання юних програмістів я покажу невеличкий фрагмент мойого коду, який викликає консольний FFMPEG у Windows-applications. Для цьго при старті виконується ось такий код:


   1:      Private Sub btStart_Click(sender As System.Object, e As System.EventArgs) Handles btStart.Click
   2:          AllocConsole()
   3:  ...
   4:      End Sub
   5:   
   6:      <Runtime.InteropServices.DllImport("kernel32.dll", SetLastError:=True)> _
   7:      Private Shared Function AllocConsole() As <Runtime.InteropServices.MarshalAs(Runtime.InteropServices.UnmanagedType.Bool)> Boolean
   8:          'https://msdn.microsoft.com/en-us/library/windows/desktop/ms681944(v=vs.85).aspx
   9:      End Function

А потім у цьому віконці відпрацьовує FFMPEG


   1:  Module ProbeFunc
   2:   
   3:      Dim db1 As New MyArchiveDB.MyArchiveEntities
   4:   
   5:      Sub GetProbe(FullName_StartsWith As String)
   6:          db1.CommandTimeout = 1000
   7:          Dim Count As Integer
   8:          Dim Recs = (From X In db1.Dirs Select X Where X.Len IsNot Nothing And X.FullName.StartsWith(FullName_StartsWith) And X.Probe Is Nothing And Not X.FName.EndsWith(".bat")).ToList
   9:          For Each One In Recs
  10:              Count = Count + 1
  11:              Console.WriteLine(Count.ToString & " " & One.FullName)
  12:              Using ts1 As New ProbeWin(One.FullName)
  13:                  ts1.GetProbe()
  14:                  Dim Str1 As String = ts1.GetResult
  15:                  If Str1 <> "" Then
  16:                      One.Probe = Str1
  17:                      db1.SaveChanges()
  18:                      Console.WriteLine(Str1)
  19:                  End If
  20:              End Using
  21:          Next
  22:          Console.WriteLine("GetProbe step ended.")
  23:      End Sub
  24:   
  25:      Sub ParseProbe(FullName_StartsWith As String)
  26:          db1.CommandTimeout = 1000
  27:          Dim Count As Integer
  28:          Dim Recs = (From X In db1.Dirs Select X Where X.Probe IsNot Nothing And X.Duration Is Nothing And X.FullName.StartsWith(FullName_StartsWith)).ToList
  29:          For Each One In Recs
  30:              Count = Count + 1
  31:              Console.WriteLine(Count.ToString & " " & One.FullName)
  32:              Dim Dur As Decimal = GetDuration(One.Probe)
  33:              If Dur > 1 Then
  34:                  One.Duration = Int64.Parse(Math.Round(Dur, 0))
  35:                  Console.WriteLine(One.Duration)
  36:              End If
  37:          Next
  38:          db1.SaveChanges()
  39:          Console.WriteLine("ParseProbe step ended.")
  40:      End Sub
  41:   
  42:      Function GetDuration(input As String) As Decimal
  43:          Dim pattern As String = "\bduration=\d+.\d+\b"
  44:          Dim match As System.Text.RegularExpressions.Match = System.Text.RegularExpressions.Regex.Match(input, pattern, System.Text.RegularExpressions.RegexOptions.None)
  45:          If match.Success Then
  46:              'Value: "duration=1.400000"
  47:              Return Decimal.Parse(match.Value.Replace("duration=", ""))
  48:          End If
  49:          Return 0
  50:      End Function
  51:  End Module
  52:  '[STREAM]
  53:  'index=0
  54:  'codec_name=h264
  55:  'codec_long_name=H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10
  56:  'profile=High
  57:  'codec_type=video
  58:  'codec_time_base=1001/48000
  59:  'codec_tag_string=[0][0][0][0]
  60:  'codec_tag=0x0000
  61:  'width=1920
  62:  'height=804
  63:  'has_b_frames=2
  64:  'sample_aspect_ratio=1:1
  65:  'display_aspect_ratio=160:67
  66:  'pix_fmt=yuv420p
  67:  'level=41
  68:  'color_range=N/A
  69:  'color_space=unknown
  70:  'timecode=N/A
  71:  'id=N/A
  72:  'r_frame_rate=24000/1001
  73:  'avg_frame_rate=24000/1001
  74:  'time_base=1/1000
  75:  'start_pts=0
  76:  'start_time=0.000000
  77:  'duration_ts=N/A
  78:  'duration=N/A
  79:  'bit_rate=N/A
  80:  'max_bit_rate=N/A
  81:  'bits_per_raw_sample=8
  82:  'nb_frames=N/A
  83:  'nb_read_frames=N/A
  84:  'nb_read_packets=N/A
  85:  'DISPOSITION:default=1
  86:  'DISPOSITION:dub=0
  87:  'DISPOSITION:original=0
  88:  'DISPOSITION:comment=0
  89:  'DISPOSITION:lyrics=0
  90:  'DISPOSITION:karaoke=0
  91:  'DISPOSITION:forced=0
  92:  'DISPOSITION:hearing_impaired=0
  93:  'DISPOSITION:visual_impaired=0
  94:  'DISPOSITION:clean_effects=0
  95:  'DISPOSITION:attached_pic=0
  96:  'TAG:language=eng
  97:  'TAG:BPS=2850885
  98:  'TAG:BPS-eng=2850885
  99:  'TAG:DURATION=02:21:18.762000000
 100:  'TAG:DURATION-eng=02:21:18.762000000
 101:  'TAG:NUMBER_OF_FRAMES=203287
 102:  'TAG:NUMBER_OF_FRAMES-eng=203287
 103:  'TAG:NUMBER_OF_BYTES=3021497325
 104:  'TAG:NUMBER_OF_BYTES-eng=3021497325
 105:  'TAG:_STATISTICS_WRITING_APP=mkvmerge v7.7.0 ('Six Voices') 32bit built on Feb 28 2015 23:23:00
 106:  'TAG:_STATISTICS_WRITING_APP-eng=mkvmerge v7.7.0 ('Six Voices') 32bit built on Feb 28 2015 23:23:00
 107:  'TAG:_STATISTICS_WRITING_DATE_UTC=2015-09-09 04:37:52
 108:  'TAG:_STATISTICS_WRITING_DATE_UTC-eng=2015-09-09 04:37:52
 109:  'TAG:_STATISTICS_TAGS=BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
 110:  'TAG:_STATISTICS_TAGS-eng=BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
 111:  '[/STREAM]
 112:  '[STREAM]
 113:  'index=1
 114:  'codec_name=dca
 115:  'codec_long_name=DCA (DTS Coherent Acoustics)
 116:  'profile=DTS
 117:  'codec_type=audio
 118:  'codec_time_base=1/48000
 119:  'codec_tag_string=[0][0][0][0]
 120:  'codec_tag=0x0000
 121:  'sample_fmt=fltp
 122:  'sample_rate=48000
 123:  'channels=6
 124:  'channel_layout=5.1(side)
 125:  'bits_per_sample=0
 126:  'id=N/A
 127:  'r_frame_rate=0/0
 128:  'avg_frame_rate=0/0
 129:  'time_base=1/1000
 130:  'start_pts=0
 131:  'start_time=0.000000
 132:  'duration_ts=N/A
 133:  'duration=N/A
 134:  'bit_rate=768000
 135:  'max_bit_rate=N/A
 136:  'bits_per_raw_sample=N/A
 137:  'nb_frames=N/A
 138:  'nb_read_frames=N/A
 139:  'nb_read_packets=N/A
 140:  'DISPOSITION:default=1
 141:  'DISPOSITION:dub=0
 142:  'DISPOSITION:original=0
 143:  'DISPOSITION:comment=0
 144:  'DISPOSITION:lyrics=0
 145:  'DISPOSITION:karaoke=0
 146:  'DISPOSITION:forced=0
 147:  'DISPOSITION:hearing_impaired=0
 148:  'DISPOSITION:visual_impaired=0
 149:  'DISPOSITION:clean_effects=0
 150:  'DISPOSITION:attached_pic=0
 151:  'TAG:language=eng
 152:  'TAG:BPS=754499
 153:  'TAG:BPS-eng=754499
 154:  'TAG:DURATION=02:21:18.059000000
 155:  'TAG:DURATION-eng=02:21:18.059000000
 156:  'TAG:NUMBER_OF_FRAMES=794818
 157:  'TAG:NUMBER_OF_FRAMES-eng=794818
 158:  'TAG:NUMBER_OF_BYTES=799586908
 159:  'TAG:NUMBER_OF_BYTES-eng=799586908
 160:  'TAG:_STATISTICS_WRITING_APP=mkvmerge v7.7.0 ('Six Voices') 32bit built on Feb 28 2015 23:23:00
 161:  'TAG:_STATISTICS_WRITING_APP-eng=mkvmerge v7.7.0 ('Six Voices') 32bit built on Feb 28 2015 23:23:00
 162:  'TAG:_STATISTICS_WRITING_DATE_UTC=2015-09-09 04:37:52
 163:  'TAG:_STATISTICS_WRITING_DATE_UTC-eng=2015-09-09 04:37:52
 164:  'TAG:_STATISTICS_TAGS=BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
 165:  'TAG:_STATISTICS_TAGS-eng=BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
 166:  '[/STREAM]
 167:  '[FORMAT]
 168:  'filename=\\192.168.0.7\Volume_1\ART-Films\Avengers Age of Ultron 2015 1080p BRRip x264 DTS-JYK\Avengers Age of Ultron 2015 1080p BRRip x264 DTS-JYK.mkv
 169:  'nb_streams=2
 170:  'nb_programs=0
 171:  'format_name=matroska,webm
 172:  'format_long_name=Matroska / WebM
 173:  'start_time=0.000000
 174:  'duration=8478.762000
 175:  'size=3823463298
 176:  'bit_rate=3607567
 177:  'probe_score=100
 178:  'TAG:encoder=libebml v1.3.1 + libmatroska v1.4.2
 179:  'TAG:creation_time=2015-09-09 04:37:52
 180:  '[/FORMAT]
 181:  '

Я маю ще багато цікавих задумок - які проги мені потрибні власне для себе, але, нажаль, не маю вільного часу на реалізацію цих задумок.



Comments ( )
<00>  <01>  <02>  <03>  <04>  <05>  <06>  <07>  <08>  <09>  <10>  <11>  <12>  <13>  <14>  <15>  <16>  <17
Link to this page: http://www.vb-net.com/FreelanceParser/index.htm
<SITEMAP>  <MVC>  <ASP>  <NET>  <DATA>  <KIOSK>  <FLEX>  <SQL>  <NOTES>  <LINUX>  <MONO>  <FREEWARE>  <DOCS>  <ENG>  <MAIL ME>  <ABOUT ME>  < THANKS ME>