'분류 전체보기'에 해당되는 글 653건

  1. 2011.12.22 [wp7] DataTemplateSelector로 ListBox의 item을 유동적으로 바꾸기
  2. 2011.12.16 [wp7] 원단위 절사 하기 (340원을 300원으로)
  3. 2011.12.13 [wp7] 화페 단위 변환하기
  4. 2011.12.07 [wp7] Custom UserControl 바인딩을 쉽게
  5. 2011.12.02 [wp7] 윈폰7 앱 메모리사용량 참조
  6. 2011.11.24 [wp7] WP7 ToolKit TimePicker 12시간제/24시간제 강제로 바꾸기
  7. 2011.11.24 [wp7] Custom DatePicker 만들기 For Toolkit
  8. 2011.11.24 [wp7] Debug, Release 외에 디버깅 모드 추가 하기
  9. 2011.11.24 [wp7] Windows Phone Marketplace Test Kit
  10. 2011.11.23 [wp7] "The application could not be launched for debugging" 에뮬레이터에서 이런 에러가 나올때
  11. 2011.11.23 [wp7] 마켓에 올릴때 에러 "The [NeutralResourceLanguage] attribute is missing on the entry assembly"
  12. 2011.11.21 [wp7] 하위 UserControl의 Parent(부모) 컨트롤 메소드 호출 하기
  13. 2011.11.16 [wp7] 윈폰에서 CSV 처리
  14. 2011.11.16 [wp7] foreach 문 처음이나 끝 부분을 Skip 하고 싶을때.
  15. 2011.11.15 [iphone] IOS 5.0.1 TextFiled Error Bug
  16. 2011.11.11 [wp7] WCF Rest 에서 Cookie값 받아오기(WCF Login Server Session) 1
  17. 2011.11.08 [iphone] IPAddress 얻어오기
  18. 2011.11.08 [wp7] EUC-KR을 윈폰7에서 사용하기 5
  19. 2011.10.24 [Portfolio] 아이폰 앱 "나도 작가다 App"
  20. 2011.10.19 [Portfolio] Window Phone 7 Cross Marketing + Nofication
  21. 2011.10.19 [PortFolio] Surface 로봇캅 폴리 (Hugeflow,2011.05,Tag 이용)
  22. 2011.10.19 [Portfolio] Window Phone 7 App "Fortune Coins" (Hugeflow, 2011.01 ~ 2011.05)
  23. 2011.10.19 [Portfolio] Window Phone 7 App "Look n Type" (Hugeflow, 2010.09 ~2010.12)
  24. 2011.10.19 [Portfolio] Windows Phone7 App "ToolBox" (Silverlight,C#,wp7,휴즈플로우) 2010.9 ~ 2010.12
  25. 2011.10.19 [Portfolio] 이노티브에서 했던 일들(2008.12 ~ 2009.10)
  26. 2011.10.19 [Portfolio] MBC 문화센터 프로그램, 쇼핑몰 홈페이지,EKP 그룹웨어 메신저,알리미 (2007년,넷블루,VB,C#,ASP,MSSQL)
  27. 2011.10.19 [Portfolio] JAVA 서버, 클라이언트 멀티 쓰레드 채팅 프로그램
  28. 2011.10.18 [Portfolio] ASP + 플래시 보안 관리 프로그램, 보안 진지 프로그램
  29. 2011.10.18 [Portfolio] 군대에서 요긴하게 써먹었던 VBS+Shell Script 2
  30. 2011.10.18 [Portfolio] 플래시 동아리 홈페이지
Windows Phone 72011. 12. 22. 10:58

WPF에서는 DataTemplateSelector가 기본적으로 제공되지만 윈폰은 없다 ㅡ.ㅡ;;

하지만 만들면 된다.

namespace GloryApp.Utils
{
    public abstract class DataTemplateSelector : ContentControl
    {
        public virtual DataTemplate SelectTemplate(object item, DependencyObject container)
        {
            return null;
        }

        protected override void OnContentChanged(object oldContent, object newContent)
        {
            base.OnContentChanged(oldContent, newContent);

            ContentTemplate = SelectTemplate(newContent, this);
        }
    }
}

이렇게 DataTemplateSelcotr class를 만들고

namespace GloryApp.Utils
{
    public class ReserveTypeSelecter : DataTemplateSelector
    {
        public DataTemplate GeneralTrain { get; set; }

        public DataTemplate TransferTrain { get; set; }

        public override DataTemplate SelectTemplate(object item, DependencyObject container)
        {
            //var data = item as JrnyInfoModel;

            if (item == GeneralTrain)
            {
                return GeneralTrain;
            }
            else
            {
                return TransferTrain;
            }

            return base.SelectTemplate(item, container);
        }
    }
}

 

이렇게 사용할 Selector를 하나만들고 SelectTemplate 메소드 안에서 자기가 원하는 DataTemplate를 선택해서 return 할수 있다.

<ListBox x:Name="ReserveListBox" ItemsSource="{Binding ResultViewData}" Grid.Row="1" >             
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <st:ReserveTypeSelecter Content="{Binding}">
                            <st:ReserveTypeSelecter.GeneralTrain>
                                <DataTemplate>
                                    <Grid>
                                        <StackPanel Orientation="Horizontal">
                                            <TextBlock Text="{Binding h_run_dt, Converter={StaticResource ShortDateFormatWithWeekConverter}}" Foreground="White"  Margin="10,0,10,0"/>
                                            <StackPanel Margin="10,0,10,0" Width="50">
                                                <TextBlock Text="{Binding h_trn_clsf_cd, Converter={StaticResource TrainNameConverter}}" Foreground="White" />
                                                <TextBlock Text="{Binding h_trn_no}" Foreground="White" />
                                            </StackPanel>
                                            <StackPanel Margin="10,0,10,0" Width="50" >
                                                <TextBlock Text="{Binding h_dpt_rs_stn_nm}" Foreground="White" />
                                                <TextBlock Text="{Binding h_dpt_tm, Converter={StaticResource StringShortTimeConverter}}" Foreground="White" />
                                            </StackPanel>
                                            <StackPanel Margin="10,0,10,0" Width="50">
                                                <TextBlock Text="{Binding h_arv_rs_stn_nm}" Foreground="White" />
                                                <TextBlock Text="{Binding h_arv_tm, Converter={StaticResource StringShortTimeConverter}}" Foreground="White" />
                                            </StackPanel>
                                            <TextBlock Text="{Binding LimitDate}" Foreground="red"  Margin="10,0,10,0"/>
                                        </StackPanel>
                                    </Grid>
                                </DataTemplate>
                            </st:ReserveTypeSelecter.GeneralTrain>
                            <st:ReserveTypeSelecter.TransferTrain>
                                <DataTemplate>
                                    <Grid>
                                        <StackPanel Orientation="Horizontal">
                                            <TextBlock Text="{Binding h_run_dt, Converter={StaticResource ShortDateFormatWithWeekConverter}}" Foreground="White"  Margin="10,0,10,0"/>
                                            <StackPanel Margin="10,0,10,0" Width="50">
                                                <TextBlock Text="{Binding h_trn_clsf_cd, Converter={StaticResource TrainNameConverter}}" Foreground="White" />
                                                <TextBlock Text="{Binding h_trn_no}" Foreground="White" />
                                            </StackPanel>
                                            <StackPanel Margin="10,0,10,0" Width="50" >
                                                <TextBlock Text="{Binding h_dpt_rs_stn_nm}" Foreground="White" />
                                                <TextBlock Text="{Binding h_dpt_tm, Converter={StaticResource StringShortTimeConverter}}" Foreground="White" />
                                            </StackPanel>
                                        </StackPanel>
                                    </Grid>
                                </DataTemplate>
                            </st:ReserveTypeSelecter.TransferTrain>
                        </st:ReserveTypeSelecter>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>

이제 xaml에서는 이렇게 2개의 DataTemplate을 넣어준다.

그래서 선택할수 있다.

참조 : http://windowsphonegeek.com/articles/Implementing-Windows-Phone-7-DataTemplateSelector-and-CustomDataTemplateSelector

소스 :

Posted by 동동(이재동)
Windows Phone 72011. 12. 16. 10:32

%를 사용하여 10으로 나눈 나마지을 빼버리면 간단~~

 

금액 = 금액 - (금액 % 10) 

 

ex)

324 - ( 324 % 10 ) = 320

Posted by 동동(이재동)
Windows Phone 72011. 12. 13. 11:11

 

public static string MoneyConvert(string money)
       {
           int result = Convert.ToInt32(money);
           return String.Format("{0:#,0}원", result);
       }

결론은 이렇고

string format 할때 N 이나 C를 쓰게 되면

 

53,900.00 원이렇게 나오기 때문에

 

이렇게 하는게 최선인듯

Posted by 동동(이재동)
Windows Phone 72011. 12. 7. 14:10

Custom UserControl을 만들고 안에 TextBox를 하나 넣었다고 가정하자

여기 TextBox에 Text를 바꾸기 위해서는 어떻게 하는게 좋을까?

Behind에서 그냥 강제로 바꾸는것이 좋을까? 아니다 그거보다 쉬운방법이 있다.

바로 DataContext에 넣어서 바인딩 하는 방법이다.

일단 유저컨트롤을 만들고 상위 Grid의 이름을 정하자 기본적으로 "LayoutRoot" 로 지정되어 있을것이다.

그리고 비하인드에서 의존 프로퍼티를 하나 만들자. 이름은 그냥 ItemSource로 지었다

#region ItemSource

       /// <summary>
       /// Gets or sets the ItemSource possible Value of the TransferTrnInfoModel object.
       /// </summary>
       public TrnInfoModel ItemSource
       {
           get { return (TrnInfoModel)GetValue(ItemSourceProperty); }
           set { SetValue(ItemSourceProperty, value); }
       }

       /// <summary>
       /// Identifies the ItemSource dependency property.
       /// </summary>
       public static readonly DependencyProperty ItemSourceProperty =
                   DependencyProperty.Register(
                         "ItemSource",
                         typeof(TrnInfoModel),
                         typeof(GeneralTrainInfoControl),
                         new PropertyMetadata(OnItemSourcePropertyChanged));

       /// <summary>
       /// ItemSourceProperty property changed handler.
       /// </summary>
       /// <param name="d">TrainInfoControl that changed its ItemSource.</param>
       /// <param name="e">DependencyPropertyChangedEventArgs.</param>
       private static void OnItemSourcePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
       {
           GeneralTrainInfoControl _TrainInfoControl = d as GeneralTrainInfoControl;
           if (_TrainInfoControl != null)
           {
               _TrainInfoControl.SetItemSource((TrnInfoModel)e.NewValue);
           }
       }

       #endregion ItemSource

       private void SetItemSource(TrnInfoModel param)
       {
           LayoutRoot.DataContext = param;
       }

그리고 source를 받으면

LayoutRoot.DataContext = param;

이렇게 dataContext에 넣게 바꿨다.

TrnInfoModel은 모델 클래스이고

<ct:GeneralTrainInfoControl ItemSource="{Binding GeneralTrainInfoSource}">

이런식으로 사용 하면 된다.

물론 모델 클래스에는 값이 다 정의 해서 넘겨줘야 한다.

이렇게 하면 해당 UserControl에서 Text같은곳에 바인딩만 걸어주면 끝~

구지 textbox.Text = TrnInfoModel.name

이런식으로 일일히 하지 않아도 되는것이다.

그리고 그냥 usrcontrol만들고 그안에 text만 binding할려면 젤 쉬운방법은

위처럼 궂이 Itemsource 의존 프로퍼티를 만들지 않고

그냥 DataContext에 넣으면 된다.

Posted by 동동(이재동)
Windows Phone 72011. 12. 2. 15:47

Microsoft.Phone.dll에 포함되어 있는 Microsoft.Phone.Info.DeviceExtendedProperties 클래스를 통해
 
long totalBytes = (long)Microsoft.Phone.Info.DeviceExtendedProperties.GetValue(“DeviceTotalMemory”);
 
이런 식으로 얻을 수 있습니다.
 
GetValue에 parameter로 전달할 수 있는 이름은 아래와 같습니다.
 
DeviceTotalMemory – 윈도우폰 전체 메모리
ApplicationCurrentMemoryUsage – 앱의 현재 메모리 사용량
ApplicationPeakMemoryUsage – 앱의 최고 메모리 사용량
 
 
메모리 사용량을 간단히 표시할 수 있는 MemoryUsageBox 컨트롤
 
이것을 간단하게 사용들 하시라고 오늘 HugeFlow.Phone 라이브러리에
메모리 사용량을 표시해주는 컨트롤을 추가하였습니다.
이름하야 MemoryUsageBox란 컨트롤입니다.
 
일반적으로는 메모리 사용량을 보고 싶은 페이지에 아래와 같은 형태로 추가하시면 끝.
 
// Constructor
public DetailsPage()
{
    InitializeComponent();
 
#if DEBUG
    LayoutRoot.Children.Add(new MemoryUsageBox());
#endif
}

Posted by 동동(이재동)
Windows Phone 72011. 11. 24. 21:01

코레일 시간은 무조건 24시간제이다 즉 오전오후를 쓰지 않고 24시간제로 쓴다.

물론 셀렉트에서는 12시간제로 하고 결과물은 24시간제로 뺼수 있다.

하지만 사용자가 12시간제이면 불편할것이다. 오후 3시를 골랐는데 15시로 나오면 좀 이상.

그래서 Toolkit의 TimerPicker에서 강제로 24시간으로 바꿀려고 노력했지만 잘안되었다.

어렵게 알았는데 시스템 설정에서 24시간 12시간제를 설정할 수가 있었고

설정대로 Picker가 알아서 바꼈다.

강제로 할려면

http://silverlight.codeplex.com/workitem/7190

여기를 참고 해서 그대로 하면 되는데 아직 해보지는 않았다 나중에 문제 생기면 해봐야지

Posted by 동동(이재동)
Windows Phone 72011. 11. 24. 16:53

예전에 했는데도 불구하고 이번에 또 하느라 삽질을 하였다.

그래서 이렇게 포스팅 한다.

먼저 Toolkit을 설치하고 소스를 받는다.

현재 무한대로 나오는 년도를 2050년까지만 나오게 하자. 년도만 나오게도 할수 있다.

 

이미지 2

 

일단 복사해야할 파일은

DataSource.cs

DatePicker.cs(필요에 따라 없어도 됨)

DateTimePickerPageBase.cs

Common 폴더에 Tuple.cs

DatePickerPage.xaml

이렇게 복사한다

DatePickerPage.xaml은 UI 에 쓰이기 때문에 이름을 바꾼다.

namespace는 그냥 가만히 나두는게 좋다

만약에 저위에 처럼 년도만 보이게 하고 싶으면

DatePickerPage.xaml.cs 에서

public partial class CustomYearDatePicker : DateTimePickerPageBase
    {
        LoopingSelector lsMonth;
        LoopingSelector lsDay;

        /// <summary>
        /// CustomYearDatePicker Constructor
        /// </summary>
        public CustomYearDatePicker()
        {
            InitializeComponent();

            // Hook up the data sources
            PrimarySelector.DataSource = new YearDataSource();
            //SecondarySelector.DataSource = new MonthDataSource();
            //TertiarySelector.DataSource = new DayDataSource();

            //가짜 데이터 넣기
            lsMonth = new LoopingSelector();
            lsMonth.DataSource = new MonthDataSource();

            lsDay = new LoopingSelector();
            lsDay.DataSource = new MonthDataSource();

            InitializeDateTimePickerPage(PrimarySelector, lsMonth, lsDay);
        }

        /// <summary>
        /// Gets a sequence of LoopingSelector parts ordered according to culture string for date/time formatting.
        /// </summary>
        /// <returns>LoopingSelectors ordered thffby culture-specific priority.</returns>
        protected override IEnumerable<LoopingSelector> GetSelectorsOrderedByCulturePattern()
        {
            return GetSelectorsOrderedByCulturePattern(
                CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern.ToUpperInvariant(),
                new char[] { 'Y', 'M', 'D' },
                //new LoopingSelector[] { PrimarySelector, SecondarySelector, TertiarySelector });
                new LoopingSelector[] { PrimarySelector, lsMonth, lsDay });
        }

 

이런식으로 바꿔준다. 가짜 데이터를 넣고 Xaml(UI)딴에서는 삭제 한다.

그리고 2050년까지만 보이게 하기 위해서

DataSource.cs를 이렇게 바꾸어 준다.

class YearDataSource : DataSource
   
{
        protected override DateTime? GetRelativeTo(DateTime relativeDate, int delta)
        {
            if ((1601 == relativeDate.Year) || (3000 == relativeDate.Year))
            //if ((2010 == relativeDate.Year) || (2051 == relativeDate.Year))
           
{
                return null;
            }

            int nextYear = relativeDate.Year + delta;

            if (nextYear < 2010)
            {
                nextYear = 2051 + (nextYear - 2010);
            }
            else if (nextYear > 2050)
            {
                nextYear = 2009 + (nextYear - 2050);
            }


            //int nextYear = relativeDate.Year + delta;
           
int nextDay = Math.Min(relativeDate.Day, DateTime.DaysInMonth(nextYear, relativeDate.Month));
            return new DateTime(nextYear, relativeDate.Month, nextDay, relativeDate.Hour, relativeDate.Minute, relativeDate.Second);
        }
    }

혹시나 모르니 DatePicker.xaml을 올려둔다.

<Primitives:DateTimePickerPageBase
    x:Class="Microsoft.Phone.Controls.CustomDatePicker"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:Primitives="clr-namespace:Microsoft.Phone.Controls.Primitives;assembly=Microsoft.Phone.Controls.Toolkit" 
    xmlns:Controls="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Toolkit" FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="PortraitOrLandscape" Orientation="Portrait"
    mc:Ignorable="d" d:DesignHeight="728" d:DesignWidth="480">

    <Primitives:DateTimePickerPageBase.Resources>
        <Controls:DateTimePickerResources x:Key="DateTimePickerResources"/>
        <ExponentialEase x:Key="Ease" EasingMode="EaseIn"/>
    </Primitives:DateTimePickerPageBase.Resources>

    <Grid Background="{StaticResource PhoneChromeBrush}">
        <VisualStateManager.VisualStateGroups>
            <VisualStateGroup x:Name="VisibilityStates">
                <VisualState x:Name="Open">
                    <Storyboard>
                        <DoubleAnimation
                            Storyboard.TargetName="PlaneProjection"
                            Storyboard.TargetProperty="RotationX"
                            From="-50"
                            To="0"
                            Duration="0:0:0.2"/>
                    </Storyboard>
                </VisualState>
                <VisualState x:Name="Closed">
                    <Storyboard>
                        <DoubleAnimation
                            Storyboard.TargetName="PlaneProjection"
                            Storyboard.TargetProperty="RotationX"
                            To="90"
                            Duration="0:0:0.2"
                            EasingFunction="{StaticResource Ease}"/>
                    </Storyboard>
                </VisualState>
            </VisualStateGroup>
        </VisualStateManager.VisualStateGroups>
        <Grid.Projection>
            <PlaneProjection x:Name="PlaneProjection"/>
        </Grid.Projection>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition/>
        </Grid.RowDefinitions>

        <!-- SystemTray placeholder -->
        <Rectangle
            x:Name="SystemTrayPlaceholder"
            Grid.Row="0"
            Height="32"/>
        <!-- Title -->
        <TextBlock
            Grid.Row="1"
            Text="{Binding DatePickerTitle, Source={StaticResource DateTimePickerResources}}"
            FontFamily="{StaticResource PhoneFontFamilySemiBold}"
            FontSize="{StaticResource PhoneFontSizeMedium}"
            Foreground="{StaticResource PhoneForegroundBrush}"
            Margin="24,16,12,24"/>
        <!-- LoopingSelectors -->
        <Grid
            Grid.Row="2"
            HorizontalAlignment="Center">
            <Grid.ColumnDefinitions>
                <ColumnDefinition/>
                <ColumnDefinition/>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>
            <Primitives:LoopingSelector
                x:Name="SecondarySelector"
                Grid.Column="0"
                Width="148"
                ItemSize="148,148"
                ItemMargin="6" >
                <Primitives:LoopingSelector.ItemTemplate>
                    <DataTemplate>
                        <StackPanel
                            HorizontalAlignment="Left"
                            VerticalAlignment="Bottom"
                            Margin="6">
                            <TextBlock
                                Text="{Binding MonthNumber}"
                                FontSize="54"
                                FontFamily="{StaticResource PhoneFontFamilySemiBold}"
                                Margin="0,-8"/>
                            <TextBlock
                                Text="{Binding MonthName}"
                                FontSize="20"
                                FontFamily="{StaticResource PhoneFontFamilyNormal}"
                                Foreground="{StaticResource PhoneSubtleBrush}"
                                Margin="0,-2"/>
                        </StackPanel>
                    </DataTemplate>
                </Primitives:LoopingSelector.ItemTemplate>
            </Primitives:LoopingSelector>
            <Primitives:LoopingSelector
                x:Name="TertiarySelector"
                Grid.Column="1"
                Width="148"
                ItemSize="148,148"
                ItemMargin="6">
                <Primitives:LoopingSelector.ItemTemplate>
                    <DataTemplate>
                        <StackPanel
                            HorizontalAlignment="Left"
                            VerticalAlignment="Bottom"
                            Margin="6">
                            <TextBlock
                                Text="{Binding DayNumber}"
                                FontSize="54"
                                FontFamily="{StaticResource PhoneFontFamilySemiBold}"
                                Margin="0,-8"/>
                            <TextBlock
                                Text="{Binding DayName}"
                                FontSize="20"
                                FontFamily="{StaticResource PhoneFontFamilyNormal}"
                                Foreground="{StaticResource PhoneSubtleBrush}"
                                Margin="0,-2"/>
                        </StackPanel>
                    </DataTemplate>
                </Primitives:LoopingSelector.ItemTemplate>
            </Primitives:LoopingSelector>
            <Primitives:LoopingSelector
                Grid.Column="1"
                x:Name="PrimarySelector"
                Width="148"
                ItemSize="148,148"
                ItemMargin="6">
                <Primitives:LoopingSelector.ItemTemplate>
                    <DataTemplate>
                        <StackPanel
                            HorizontalAlignment="Left"
                            VerticalAlignment="Bottom"
                            Margin="6">
                            <TextBlock
                                Text="{Binding YearNumber}"
                                FontSize="54"
                                FontFamily="{StaticResource PhoneFontFamilySemiBold}"
                                Margin="0,-8"/>
                            <TextBlock
                                Text=" "
                                FontSize="20"
                                FontFamily="{StaticResource PhoneFontFamilyNormal}"
                                Foreground="{StaticResource PhoneSubtleBrush}"
                                Margin="0,-2"/>
                        </StackPanel>
                    </DataTemplate>
                </Primitives:LoopingSelector.ItemTemplate>
            </Primitives:LoopingSelector>
        </Grid>
    </Grid>

    <Primitives:DateTimePickerPageBase.ApplicationBar>
        <shell:ApplicationBar IsVisible="True">
            <shell:ApplicationBarIconButton
                IconUri="/Toolkit.Content/ApplicationBar.Check.png"
                Text="DONE"/>
            <shell:ApplicationBarIconButton
                IconUri="/Toolkit.Content/ApplicationBar.Cancel.png"
                Text="CANCEL"/>
        </shell:ApplicationBar>
    </Primitives:DateTimePickerPageBase.ApplicationBar>

</Primitives:DateTimePickerPageBase>

그냥 xaml을 복사하면 에러가 날것이다.

2개는 꼭 이렇게 수정한다.

xmlns:Primitives="clr-namespace:Microsoft.Phone.Controls.Primitives;assembly=Microsoft.Phone.Controls.Toolkit" 
 xmlns:Controls="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Toolkit"
사용법은
 
<tk:DatePicker x:Name="TkDatePicker" PickerPageUri="/GloryApp;component/Controls/CustomDatePicker.xaml" />

알아내느라 힘들었고 출처 따윈 없다. 검색해도 안 나옴 toolkit 소스를 직접 분석해야 한다.
 
 
Posted by 동동(이재동)
Windows Phone 72011. 11. 24. 10:21

폰에 광고를 넣을 일이 있어서 광고 버전과 광고가 장착되지 않은 버전으로 결과물이 다르게 나오게 하고 싶었다.

Debug, Release

외에 DebugAD,RelaseAD 를 만들어서 빌드할때 옵션을 저렇게 주면 bin/ReleaseAD 폴더에 xap파일이 생성된다.

 

빌드에서 Configuration Manager을 클릭

image1

 

New를 클릭

이미지 4

 

Name을 설정하고 Setting을 Release 한다.디버그도 따로 만들어 놓는 것도 좋다.

이미지 5

 

설정이 되었으면 Configration에서 ReleaseAD를 설정하고

아래 symbols 에 AD 를 꼭! 집어 넣는다.(중요!)

그냥 표시니 다른걸로 바꿔도 된다.

 

이미지 8

자 이제 소스에서 차별점을 두어보자

#if !AD
            AdControl.Visibility = System.Windows.Visibility.Collapsed;
#endif

소스에 이런식으로 넣게 되면 AD가 아닐때 즉 보통 릴리즈모드일때는 광고가 보이지 않게 된다.

Posted by 동동(이재동)
Windows Phone 72011. 11. 24. 09:57

http://msdn.microsoft.com/en-us/library/hh394032(v=vs.92).aspx

시간이 없으니 나중에 해보자

Posted by 동동(이재동)
Windows Phone 72011. 11. 23. 16:09

망고 7.0 에서 7.1로 컨버팅 하는 과정에서 실행을 해도 저런 에러가 날 때가  있다.

“The application could not be launched for debugging. Ensure that the target device screen is unlocked and that the application is installed”

풀 에러 메세지는 저렇다

그럼 어떻게 하느냐?

solution Properties에서(솔루션 오른쪽 버튼 클릭)

err

 

저렇게 해당 start Project에서 Deploy 부분이 체크가 안되 있을것이다.

Depoly 부분 체크를 다시 해놓으면 제대로 작동된다.

참고 : http://cisforcoder.wordpress.com/2011/02/17/the-application-could-not-be-launched-for-debugging-when-using-the-wp7-emulator/

Posted by 동동(이재동)
Windows Phone 72011. 11. 23. 13:26

마켓에 app을 올릴때 이런 에러가 난다면?

이미지 1

해당 프로젝트에서 오른쪽 버튼 눌러서

Assembly information 에서 nerialResource Lanuge를 설정한다.

참고 : http://stackoverflow.com/questions/6741455/the-neutralresourcelanguage-attribute-is-missing-on-the-entry-assembly

Posted by 동동(이재동)
Windows Phone 72011. 11. 21. 16:05

일단 UserControl을 하나 만들고

메인 페이지 xaml에 넣는다.

<uc:RadJobId x:Name="RadJobIDUserControl" Visibility="{Binding RadJobIdPopupVisiblity}"/>

이런식으로 넣었다. 이제 이 UserControl 안에 Button을 넣고

버튼을 클릭시에 메인페이지(상위 페이지)에 있는 메소드나 ViewModel에 접근해보겠다.

 

private void CancelBtn_Click(object sender, RoutedEventArgs e)
        {
            PhoneApplicationFrame frame = Application.Current.RootVisual as PhoneApplicationFrame;
            var parentView = frame.Content as ReserveTicketSelectView;
            var parentViewModel = parentView.DataContext as ReserveTicketSelectViewModel;
            parentViewModel.RadJobIdPopupVisiblity = Visibility.Collapsed;
        }

 

간단하다.

접근해서 viewModel의 Peroperty를 변경한 예제 이다.

Posted by 동동(이재동)
Windows Phone 72011. 11. 16. 17:19

코레일의 역정보를 어디서 가져오나 싶었더니 sqllite를 이용하여 가져왔다.

나도 그것을 복사해서 해볼려고 했었지만 외부에서 가져온 sqllite 파일의 인코딩이 UTF8이 아니라 UTF16이여서

읽혀지지가 않았다.

그래서 어짜피 로컬 파일이니 그냥 csv로 만들어서 넣었다.

내가 한 작업은 이렇다.

1. sqlLite Database Browser에서 아이폰소스에서 가져온 KorailDatabase.sqlite 파일을 로드 한다.

2. file - export-에서  csv 파일로 export한다.

3. 메모장으로 아까 저장한 csv 파일을 다른이름으로 저장하는데 인코딩을 UTF8로 다시 저장한다.

4. 이제 윈폰7에서 정상적으로 한글로 보이고 파싱한다.
 

만약 나중에 역이 업데이트 되었을때 아이폰소스에서 저 파일만 다시 받아서 저렇게 csv파일로 만들어서 윈폰에 넣으면 된다.

아래는 csv를 List로 만든 소스이다.

 

    private List<StationsModel> GetStationsList()
    {
        var resource = Application.GetResourceStream(new Uri(@"/GloryApp;component/Resources/KorailStations.csv", UriKind.Relative));

        StreamReader streamReader = new StreamReader(resource.Stream);
        string stations = streamReader.ReadToEnd();

        var StationsSplitData = stations.Split('\n');

        List<StationsModel> stationLists = new List<StationsModel>();

        foreach (var item in SkipData.First(StationsSplitData))
        {
            if (item == "")
                continue;

            var splitString = item.Split(',');

            stationLists.Add(new StationsModel()
            {
                code = splitString[0].Replace("\"", ""),
                lat = splitString[1].Replace("\"", ""),
                lng = splitString[2].Replace("\"", ""),
                title = splitString[3].Replace("\"", ""),
                ktx = splitString[4].Replace("\"", ""),
                indexgroup = splitString[5].Replace("\"", ""),
                maingroup = splitString[6].Replace("\"", "")
            });
        }

        return stationLists;
    }
}
Posted by 동동(이재동)
Windows Phone 72011. 11. 16. 16:14

CSV파일을 윈폰에서 읽을때 첫줄을 Skip 하고 싶을때 사용한다.

csv 첫줄에는 대부분 데이터들의 컬럼값 즉 메뉴 이름같은것이 들어가기때문에

첫줄을 제외한 나머지 데이터를 뽑을때 유용한다. 혹은 마지막데이터를 끊거나

풀 소스

/// <summary>
/// csv 파일을 읽을때 처음 한줄을 Skip 할때 사용
/// foreach문등에서 처음 인덱스와 끝의 인덱스를 감지 한다.
/// </summary>
public static class SkipData
{
    public class SkipFirst<T> : IEnumerable<T>
    {
        private IEnumerable<T> mEnum;

        public SkipFirst(IEnumerable<T> enm)
        {
            mEnum = enm;
        }

        #region IEnumerable<T> Members

        public IEnumerator<T> GetEnumerator()
        {
            IEnumerator<T> iter = mEnum.GetEnumerator();
            if (iter.MoveNext())
            {
                while (iter.MoveNext())
                {
                    yield return iter.Current;
                }
            }
        }

        #endregion IEnumerable<T> Members

        #region IEnumerable Members

        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }

        #endregion IEnumerable Members
    }

    public class SkipLast<T> : IEnumerable<T>
    {
        private IEnumerable<T> mEnum;

        public SkipLast(IEnumerable<T> enm)
        {
            mEnum = enm;
        }

        #region IEnumerable<T> Members

        public IEnumerator<T> GetEnumerator()
        {
            IEnumerator<T> iter = mEnum.GetEnumerator();
            if (iter.MoveNext())
            {
                T curr = iter.Current;
                while (iter.MoveNext())
                {
                    yield return curr;
                    curr = iter.Current;
                }
            }
        }

        #endregion IEnumerable<T> Members

        #region IEnumerable Members

        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }

        #endregion IEnumerable Members
    }

    static public SkipFirst<T> First<T>(IEnumerable<T> enm)
    {
        return new SkipFirst<T>(enm);
    }

    static public SkipLast<T> Last<T>(IEnumerable<T> enm)
    {
        return new SkipLast<T>(enm);
    }
}

참고 : http://honestillusion.com/blogs/blog_0/archive/2007/02/05/c-code-adding-skip-first-to-foreach.aspx

참고로 사용은 이렇게 한다.


foreach (var item in SkipData.First(StationsSplitData))
Posted by 동동(이재동)
iPhone App2011. 11. 15. 17:02
이거때문에 반나절을 삽질 했다.

일단 사건의 발단은 이렇다.

나도 작가다 앱 테스트까지 마쳤는데 

IOS 5.0 까지 모두 잘 되었는데 5.0.1(배터리 문제만 해결했다는 버전)으로 업글 한사람들은

글을 쓰기 위해서 Focus를 TextField로 가는순간 앱이 죽어 버렸다.

코레일로 바쁘지만 크리티컬한 에러이고 책임감에 불싸여서 쉽게 해결 할줄 알았고 인터넷에도 같은 문제로

많은 어려움을 겪고 있을꺼라 생각하고 검색했더니?

아니 이게 머야? 아무리 모든 검색어를 동원해도 나오질 않았다.!!! 사람들은 모르는건가? 버그인것을?

아니면 내앱에서만 나오는건가? 코딩이 문제인것인가? 

일단 쉽게 해결되지 않을꺼라는 것을 깨닫고 코레일 일정에 맞추어 작업을 하고 싶었지만 도저히 버그를 앞에 두고

딴 작업이 쉽게 될리가 없었다. 일단 에러가 났는데

int main(int argc, char *argv[]) {

    

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    int retVal = UIApplicationMain(argc, argv, nil, nil);

    [pool release];

    return retVal;

}


자꾸 이부분에 걸려서 NSZombie를 사용하는데도 불구하고 잡히지를 않았다 stack도 봤지만.. 기계어뿐...

콘솔에서 에러가 나나 싶어서 살펴 보았더니
 
wait_fences: failed to receive reply: 10004003

이런 에러가 하나 나왔다. 흠..

검색해서 보니 또 alert랑 textfiled resignFirstResponder 에러라길래 다 삭제도 해보고 별짓을 다 해봐도 에러가 났다.

결국 삽질해서 해결한건 바로

UITextFiled의  Keyboard를 기존 Default에서 E-mail Address로 변경했더니

잘되었다. 헐... 

인터넷에 세계 최초로 올리니 나처럼 삽질하는사람에게 도움이 되기를.. 아마 5.0.2 에서 패치 될꺼 같지만~
Posted by 동동(이재동)
Windows Phone 72011. 11. 11. 15:27

아… 대단하다 이것 때문에 하루종일 샤워 할때도.. 꿈꿀때도 아침에 일어날때도 계속 이것을 어떻게 해결해야하나 싶었다.

현재 윈폰용 코레일 앱을 만드는데 EUC-KR에 이어 난항을 겪었다.

사건의 발단은 이렇다.

코레일에서 Rest Sevice를 이용해서 XML등을 읽어와서 파싱하는데

예약 현황 같은것은 로그인을 해야만 가능한것이였다.

웹에서를 예로 들면

로그인 인증 페이지 URL을 접속 해야만 예약 현황을 볼수 있는 페이지를 볼수 있었다.

만약 로그인 인증 페이지 URL을 먼저 접속하지 않으면 예약 현황 페이지에서는 로그인을 해야만 볼수 있다라고 뜬다.

그래서 내가 한방법은 Webclient를 이용해서 로그인 인증 페이지를 먼저 접속 후 예약 현황 페이지를 다시 호출한것이였다.

하지만 그 방법 역시 작동을 안했다. 구글링을 해서 좀더 로우레벨로 해보기로 하여 HttpWebRequest로도 해보고 아이폰쪽 소스도 보고 별짓을 다 했다.

결국 해결한것은 바로 쿠키였다 철도청 관계자는 서버 세션 유지라고 해서 난 쿠키랑 아무런 관계가 없을줄 알았다. 여기서 시간을 엄청 소비했다.

태규형님에게 도움을 요청했고 비슷한 사례를 하나 찾아주셧다.

http://bytes.com/topic/net/answers/426631-web-service-session-winform-client

결국난 CookieContainer 를 설정해야 한다는것을 깨닫고

Webclient를 override해서 가능하다는것을 깨달았다.

http://social.msdn.microsoft.com/Forums/en/csharpgeneral/thread/149d545f-b605-4fce-b29a-2bfb1c51fbbe

하지만 그것은 WinForm에서는 작동했지만 윈폰에서는 약간의 보안문제로 다시 수정,보완을 하였다.

결국 성공.. 이틀동안의 삽질에 대한 눈물이 났다. ㅠㅠ

다음은 이틀 동안 고생해서 내가 만든 윈폰7용 소스이다. 이건 진짜 인터넷에 하나도 없다 ㅠㅠ

public class CookieAwareWebClient : WebClient
    {
        private CookieContainer m_container = new CookieContainer();

        [SecuritySafeCritical]
        public CookieAwareWebClient()
        {
        }

        protected override WebRequest GetWebRequest(Uri address)
        {
            WebRequest request = base.GetWebRequest(address);
            if (request is HttpWebRequest)
            {
                (request as HttpWebRequest).CookieContainer = m_container;
            }
            return request;
        }
    }

사용은 그냥

 _webClient.OpenReadAsync(new Uri(url));  _webClient.OpenReadCompleted 
 
를 사용하였다.             
Posted by 동동(이재동)
iPhone App2011. 11. 8. 16:26
참조 : http://mastership.kr/entry/iPhone-iPod의-네트워크-주소-알아내기

사용법



Posted by 동동(이재동)
Windows Phone 72011. 11. 8. 11:46

이번에 코레일 프로젝트를 맞게 되었다.

하지만 코레일은 EUC-KR로 된 XML이였고 윈폰과 실버라이트는 지원하지 않았다.

하지만 어떤 고마우신분이 라이브러리를 제공해 주셧다 프로젝트 시작하기 3일전에… 타이밍!!!

일단 외부에서 EUC-KR로 된 xml파일을 윈폰에서 사용하는 방법

 

public void GetXmlData(Action<Dictionary<string, string>, Exception> callback, string url)
{
    WebClient webClient = new WebClient();
    webClient.OpenReadAsync(new Uri(url));
    webClient.OpenReadCompleted += (s, e) =>
        {
            Stream readStream = e.Result;
            Byte[] euckrXML = new Byte[readStream.Length];

            readStream.Read(euckrXML, 0, euckrXML.Length);
            readStream.Close();

            var temp = EUCKR_Unicode_Converter.GetUnicodeString(euckrXML);
            XmlReader reader = XmlReader.Create(new StringReader(temp));
            XElement xe = XElement.Load(reader);

            //상위 element data
            Dictionary<string, string> dict = new Dictionary<string, string>();
            foreach (var item in xe.Elements())
            {
                dict.Add(item.Name.LocalName, item.Value);
            }

            //다수의 하위 elements data
            var query = from item in xe.Descendants("trn_infos").Descendants("trn_info")
                        select item;

            List<Dictionary<string, string>> trnsInfos = new List<Dictionary<string, string>>();
            foreach (XElement item in query)
            {
                Dictionary<string, string> trnInfo = new Dictionary<string, string>();
                foreach (XElement subItem in item.Elements())
                {
                    trnInfo.Add(subItem.Name.LocalName, subItem.Value);
                }
                trnsInfos.Add(trnInfo);
            }

            //출력
            foreach (var item in trnsInfos)
            {
                foreach (var subItem in item)
                {
                    Debug.WriteLine("{0}:{1}", subItem.Key, subItem.Value);
                }
            }

            callback(dict, null);
        };
}

 

위의 XElement 까지만 참고하면 될꺼 같다.

나머지 소스는 그냥 xml을 dictionary로 바꾸기 위한 소스코드이다.

자 이제 euc-kr은 문제 없이 웹으로 부터 받아서 파싱 가능한 상태이다.

그렇다면 보낼때는 어떻게 해야할까?

내가 원하는 결과 값 : 서울 -> "%BC%AD%BF%EF"

이다. 원래 같았으면

string encodingResult = HttpUtility.UrlEncode(url);

이런식으로 urlencode를 이용하겠지만  이렇게

해서 해결하였다.

Byte[] temp = EUCKR_Unicode_Converter.GetEucKRString("서울");
StringBuilder sb = new StringBuilder();
foreach (byte b in temp)
{
    sb.AppendFormat("%{0:x}", b);
}

sb.tostring();

카일로님이 만드신 소스 정말 유용한거 같다.^^

원본 소스다.

Posted by 동동(이재동)
포트폴리오2011. 10. 24. 11:33


이앱을 만들기 위해서 그전에 칼로리 계산기라던지 hugeboard라는 앱등을 만들어 보았지만 정식 App Store에 올리는 첫 앱입니다.

http://www.1004story.com

사이트를 App으로 만든것인데 서버는 WCF Rest 서비스를 이용하였고 서버에서 XML형식으로 데이터를 보내주면 아이폰에서 파싱해서 사용자들에게 보여주는 앱입니다.

이앱을 만들기 위해서 XmlManager, XmlParser를 직접 만들었으며 현재 인기를 끌고 있는 Facebook, Twitter 앱을 모티브로 해서 만들었습니다. 

구현한 기술
-Refresh to Scroll (위로 올렸다가 내리면 리로딩)
-페이징 (한번에 모든 페이지를 보여주는게 아니라 스크롤이 내리면 10개씩 데이터를 로드)
-Xml Paring (XML 파싱 라이브 러리를 사용한게 아니라 NSParser를 직접 개조해서 제작)
-Twitter,Facebook 연동
-이미지 캐시(Tableview 속도 UP)
-커스텀 테이블 뷰 구현
-달력 컨트롤 사용

등등 입니다.


앱 다운받는곳

http://itunes.apple.com/kr/app/id470488910?ls=1&mt=8



 이외에도 디자인 적용이라든지 로그인 구현이라든지 자잘한게 있지만 스크린샷으로 대체 하겠습니다.














아래는 우리 수석 디자이너 이기백씨가 수정한 이미지 입니다.




 
Posted by 동동(이재동)
포트폴리오2011. 10. 19. 17:32


현재 모든 휴즈플로우 앱에 장착했던 Cross 마켓팅 페이지

나는 주로 About 페이지로 불렀는데 이미지와 글을 서버로부터 받아와서 클릭시  마켓으로 자동 연결해주며

서버와 연동이 되기때문에 앱이 새로이 추가가되면 앱소개와 이미지가 자동으로 추가 된다.

그래서 자동으로 마켓팅이 되는 페이지 이다.

그리고 Notifiations을 지원하여 앱이 추가 되거나 변경될시 푸시 알림, 아이콘 변경 알림등 여러가지 방법으로 알려준다. 
Posted by 동동(이재동)
포트폴리오2011. 10. 19. 16:56

태그를 이용해서 surface에 책을 올려놓고 페이지를 넘길때마다 화면이 바뀌는 프로그램

동영상, 사진 등 멀티미디어적인 요소를 보여준다.

http://hackss.tistory.com/entry/surface-surface-런칭쇼에-내가-만든-프로그램-공개

이전에 올린 포스팅 참고

Posted by 동동(이재동)
포트폴리오2011. 10. 19. 16:21

휴플에서 만든 최초의 소셜 게임입니다.

-Camera, Compass, Accerometer AP 사용
-WCF 웹서비스 연동

여러가지 기능이 있지만 설명은 일단 생략




아래는 디자이너 기백씨가 수정한 이미지



자세한 정보는 여기에

Posted by 동동(이재동)
포트폴리오2011. 10. 19. 16:17
걸으면서 타이핑을 할수 있는 앱입니다.

-자주쓰는 텍스트 저장기능
-SNS 연동기능(Twitter,Facebook)
-Camera 사용
-폰트 및 색 변경 기능




자세한 설명은 여기에

Posted by 동동(이재동)
포트폴리오2011. 10. 19. 16:13

휴즈플로우에 처음 입사후 맡은 프로젝트 입니다.

윈도우폰7이 실버라이트 기반이라서 머 여러가지 역경이 있었지만 무사히 마친 프로젝트 입니다.

구글링을 하면 더 자세한 설명과 동영상이 나옵니다.

자세한 설명은 여기에




 

Posted by 동동(이재동)
포트폴리오2011. 10. 19. 16:01
Control Server Manager 개발 및 유지보수(WPF/WCF/Blend) 2008.12 ~ 2009. 10
 -WCF Service와 Ado.net 을 이용하여 DB 업데이트
 -DataGrid에 직접 Binding을 걸어 엑셀과 같은 CRUD 구현
 -WCF Service를 이용하여 매니저에서 파일전송 기능 구현
 -DB Management 대신 손쉽게 DB 정보를 수정하여 편리성 향상 기여
 -모든 WPFControl 디자인 직접 수정 (템플릿 포함) 
 -DataGrid(ToolKit) 디자인 수정 중급 강좌 등록(훈스닷넷)
 -그외 ComboBox Tab Control 등 블랜드로 직접 템플릿 수정


 Innotive Console Basic Prototype 개발(WPF/Blend)
 -혼자서 진행한 프로젝트
 -WPF에서 지원하지 않는 MDI 형식 자체 개발
 -드래그엔 드랍 기능 개발 
 -무제한 모자이크 뷰 개발
 -MDI 창 정렬,크기조정,숨기기 지원
 -Treemenu에서 Drag and Drop 지원

 Smooth Streamming Server / Client 개발 (C#/Silverlight)
 -Smooth Streaming Server 제어 프로그램 개발(IIS 직접제어)
 -Smooth Streaming Player 모자이크뷰 성능테스트 클라이언트 개발(Silverlight)

 Innotive Server 자동설치 스크립트 개발(PowerShell)
 -IIS, MSSQL 2008 Server 무인설치 스크립트
 -각종 서비스 등록 및 Server 테스트 스크립트 제작

 OCP Inno Search 프로그램 제작 (PHP/Silverlight/C#)
 -책안의 내용물까지 검색하여 뷰어로 표시
 -내용물을 DB에 입력하는거 대신 Window Search 4.0 을 이용하여 검색시간 대폭 단축
 -결과물을 Ajax Browser/Silverlight Browser/Flash Browser 등 다양하게 표출 
Posted by 동동(이재동)
포트폴리오2011. 10. 19. 15:49
대학교 3학년 마쳤을때 난 실무 프로그래밍이 어떤지 궁금했었습니다.

내가 지금까지 개발한거와 많은 차이가 있을까? 팀 단위 개발은 어떻게 할까? 소스관리는 또 어떻게 할까?

라는 끊음없는 의문점이 들기도하고 걱정도 들었습니다.. 그 당시 학교에서 배운거는 그냥 간단한 홈페이지나 DB사용이 다여서 좀더 욕심이 났던거 같습니다.

하지만 4학년을 올라가기전에 찬스가 왔습니다.. 바로 회사를 인턴으로 이수를 하면 한학기 학점을 준다는 솔깃한 제의였습니다.

이렇게 함으로써  저는 넷블루라는 대구에 있는 회사에 근무하게 됩니다. 당시 전 영대 근처에서 자취를 했었기 때문에 1시간이면 대구에 있는 회사를 갈수가 있었죠 물론 버스 한번 갈아타고 지하철 한번타고 또 다시 버스를 타야 하는 불편함이 있었지만 첫직장이라는 기대반 설레임반으로 정말 시간가는줄 몰랐습니다.

그쪽의 형들(?)도 친절했고 시간마다 담배 피러 가는 재미도 솔솔했습니다. 저는 유일하게 그쪽에서 담배를 피지 않았기 때문에 그냥 물한잔 들고 쫄랑 쫄랑 따라가서 프로그래머라는 직업에 대한 궁금적인것을 묻고 세상사는법을 조금이라나마 배울려고 항상 귀찮게 했죠. 그당시 제가 맡은 것은 응용프로그램 파트였는데 모든 사람들이 JSP 웹쪽이라 혼차서 모든것을 해야만 했었습니다.

저는 주로 ASP나 VB를 다루었었는데 VB로는 대구 MBC  회원 관리 프로그램을 짰었고 ASP로는 쇼핑몰 홈페이지를 관리 하였습니다. 

처음부터 제가 만든것은 아니고 이미 만들어져 있던  VB 회원 관리 프로그램에 마일리지 기능을 추가 하는것이였는데
마일리지 기능을 추가할려니 모든 기능을 알아야 하고 프린트부터 DB까지 모두다 알아야만 가능했기때문에
처음 일주일은 업무 분석에 들어갔습니다. 

그당시 기본 쿼리만 할줄알던 제가 서브쿼리부터 시작해서 엄청나게 분석했었죠 하나 하나 나누어서도 실행해보고 ㅋ
하지만 그때 VB를 처음으로 제대로 해서 좋은 경험이 되었다고 생각합니다.  그리고 좋은 툴임에도 불구하죠
그냥 간단하게 짤때 그당시에는 생산력이 엄청 좋았거든요 하지만 당시 Visual Studio 6.0 툴을 써서 좀 불편하던 기억이 납니다.

현재 Visual Studio 2010을 쓰는데 그때는 참 어떻게 썻나 싶군요~

ASP는 주로 쇼핑몰을 유지 보수하는데 사용했었습니다. 넷블루 쇼핑몰은 죄다 ASP로 되어있더라구요
소스를 보면서 좀 어의 없는 코드가 많이 있었지만.. 예를들면 for문 쓰면 될것을 하드코딩으로 한다던가... 헐.~~!!!

머 자잘하게 코드를 대량 수정하는도중 쇼핑몰 관리자에게 전화가 왔었습니다.(그때는 전화도 제가 받았다는 ㅠㅠ)

쇼핑몰에 이미지 업로드가 안된다는 이야기였습니다.  그리고 얼마전까지는 됬다구요.. 그말을 듣는순간 여러가지 생각을 했습니다. 예전까지는 잘되었다면 소스문제 보다는 iis문제인가? 라는 의문점이 들더군요 하지만 iis가 문제라면 홈페이지도 안되야 되지 않나라는 생각도 들어서 테스트를 해보았더니 응답이 없을정도로  서버 cpu 사용량과 iis 메모리 사용량이 늘길레 실제 업로드 되는 폴더를 보니 과관이었습니다. 이미지가 10000개 정도 있는데 모두 한폴더에 업로드가 되어있더라구요...한 폴더에 엄청난 양의미지가 있다보니 시간이 오래걸릴수밖에요...
년도별 월별로 폴더를 나누고 이전 이미지도 호완되도록 수정은 했던 기억이 납니다.

역시 ASP로 NUC C/S 프로그램 수정 및 유지보수(templet방식의 ASP,MSSQL) 했었고

EKP 그룹웨어 알리미(JSP,MYSQL,VB) 제작
EKP 연동 메신저(C#,MYSQL)제작

했던기억이 납니다 형들이 JSP로 주로 그룹웨어를 만들곤 했었는데 
결제가 오거나 메세지가 오면 알려주는 알리미도 만들고 그당시에 C# 공부겸 자바로 했던 네트워크 경험을 살려서
연동 메신저도 만들었습니다. 

스크린샷은 여기에 포스팅 

http://hackss.tistory.com/entry/c-메신저-PreView

현재 위에는 초기버전 메신저를 만들었었는데 그뒤로 UI나 기능을 바꾼 완성본은 아쉽게도 스크린샷이 없네요

현재 넷블루 회사는 없어졌다고 들었습니다.  ㅠㅠ

요약
NUC C/S 프로그램 수정 및 유지보수(templet방식의 ASP,MSSQL)
 MBC 문화센터 프로그램(VB,MSSQL) 유지보수 및 수정 새로운기능 제작
 EKP 그룹웨어 알리미(JSP,MYSQL,VB) 제작
 EKP 연동 메신저(C#,MYSQL)제작

 
Posted by 동동(이재동)
카테고리 없음2011. 10. 19. 13:14
예전에 SKYIRC로 흉내만 냈더라면 이번에는 JAVA를 이용하여서 멀티 쓰레드 채팅프로그램을 만들었습니다.

이것도 역시 군대에서 사비버팀에 있으면서 일정보다 일찍 개발을 끝내고 틈틈히 공부해서 만들었던 프로그램입니다.

군대에서 인터넷을 할수 없었던 터라 외박 나왔을때 산 책과 몰래 가져온 Java API문서를 이용해서 만들었습니다.

역시나 웹만 주구장창 하던 시절 이번에는 누군가에게 보여주기 위해서가 아닌 나자신을 위해서 그리고 네트워크 프로그래밍을 접해보고자 만든 프로그램입니다.

자바로 서버를 만들기에는 정말 적합했지만 클라이언트면에서는 조금 부족했기때문에 그당시에 제가 만들때 AWT 와 Swing이 있었는데 저는 화려한 UI를 위해 역시 Swing을 택하여 클라이언트 프로그램을 만들었습니다.

멀티 쓰레드 프로그램이라는게 그당시 저에게는  약간 어려운 개념이였고 난 넷마블같은 오목 세이클럽 같은 채팅프로그램
을 생각하면서 열심히 만들었습니다. 그 당시 이클립스 툴로 짰었는데 이건 머 메모장이나 해봐야 드림위버나 쓰던제개 충격적인 프로그램이었죠..  디버깅도 예전에는 print로 보았고 만약 쓰레드나 배열 안에 있는 내용을 보기 위해서 toString()같은 것을 써서 하나하나 확인해야했었으면 끔찍했었을것입니다. ㅠㅠ 

그렇게 해서 멀티 쓰레딩을 이용한 채팅방을 만들었습니다.
그때 기능이라곤 방만들기, 방접속, 방안에 채팅, 방안에 사람 보기,쪽지 보내기 정도 였죠.. 하지만 처음으로 서버/ 클라이언트 프로그래밍을 했었고 나름 그당시에 군대에 인트라넷 안에서도 프로그래밍 동호회 같은게 있어서 JUnit으로 나름 유닛  테스트도 했었죠

사실 지금도 바쁜 개발 환경속에 유닛 테스트는 잘못하지만 그냥 그 당시에는 제개 많은 것을 깨우치게 해준 시절인거 같습니다.
 
Posted by 동동(이재동)
포트폴리오2011. 10. 18. 15:13
이것도 역시 군대에서 만들었던 프로그램입니다.

전산실 상병 꺽이고 사단장이 사이버 팀이라는것을 만들고 제가 팀장으로 임명되었습니다.

그리고 각 연대에서 3명이 와서 총 4명으로 사이버 팀이 결성이 되었죠

근데 팀원들 3명이 다 px병,보병 ㅠㅠ 거기다가 모두 이등병... 어쩔수 없이 혼자서 만들었습니다.

첨에 임무가 html로만 이루어진 보안진지 프로그램이였고

이건 큰프로젝트 였었습니다. 사단의 모든 연대의 작전병들(약 30명정도?)를 데리고 진지의 위치 및 

진지 설명을 하는 웹페이지 였습니다.

저혼자만 할수 있는 프로젝트가 아니라 작전병들에게 제가 어떻게 하는지 가르쳐주고 해야 하는 작업들이라

팀워크가 중요했고 저는 그렇게 모인 자료를 짜집기 하고 통합하는 작업을 하였습니다.

그리고 모든게 완성 되었을때 사단장 ,군단장까지 가서 발표하고 정신이 없었습니다.

그리고 그뒤에도 몇개의 프로젝트가 있긴 했는데 그중 생각나는게 ASP와 플래시로 만든 보안 관리 프로그램입니다.

플래시와 ASP를 연동해서 역동적이게 보이면서 프로그램적인 기능도 모두 들어가서 보여주기식의 군대 시스템에 

적합했습니다. 단.. 기획, 디자인, 개발을 제가 다해서 힘든 작업이었죠...

역시 군대 프로그램이라 스크린샷이 없습니다. 군대에서 찍어올걸 아쉽군요... 다시 군대 갈수도없고(헉!!!)

 
Posted by 동동(이재동)
포트폴리오2011. 10. 18. 14:43

때는 바햐흐로 제가 35사단에서 근무했던 군대로 돌아갑니다.

 저는 원래 통신병 이였습니다. VHF 병이 였죠... 하지만 당시에 전산병 인가가 모잘랐고

저도 통신병보다는 전산병을 원했기 때문에 들어오자마자 전산병을 하였습니다.

전산병은 생각보다 힘든 직업이라는걸 아무도 모를것입니다. 하지만 나름 편한점도 많았죠.

근무시간은 제가 있었을시절에는  밤 10~12시사이에 근무가 꼭있는데 전산실에서 사수 부사수가 2명이서 전산실을 지키는 일입니다. 그때 저는 막내라 항상 부사수 위치에 있었기때문에 일지를 써야했었죠

일지 쓰는일은 생각보다 시간이 오래걸리고 귀찮은 일이였습니다.
처음에는 아무것도 모르기때문에 거의 2시간동안 이리저리 뛰어다니면서 했었습니다. 하지만 한달이 지나고 두달이 지나니깐

이거 원 반복적인 작업을 계속 하고 있고 패턴이 보였습니다.

일단 엑셀작업같은것은 매크로+VBS로 해결함으로써 버튼 하나로 해결하였고
복사 작업 같은것도 VBS로 해결하니 엄청 편하였습니다.

기존에 BAT 파일 즉 배치 파일이죠.. 초딩부터 사용해오던 autoexec.bat 를 수많이 수작업을 많이 해오던 터라
배치파일이 편하였지만 VBS의 깔끔함과 BAT파일의 한계를 넘더라구요

이렇게 스크립트에 눈을 뜬 나는 정말 모든것 하나까지 자동화 하기위해서 유닉스 의 shell script를 제작하기로 했습니다.
그때 고참들은 일일이 유닉스에 명령어를 치더라구요 헐... 저는 반복적인 작업을 싫어하기때문에 모조리 스크립트로
만들었습니다.  

만드는 시간은 일지를 쓰는 시간보다 10배는 오래 걸렸지만 완성된후에 2시간동안 쓸 일지를 10분도 안돼서 쓰고
남은 시간에 놀았죠 ㅋㅋ  
Posted by 동동(이재동)
포트폴리오2011. 10. 18. 14:20

대학교에 입학 하던 시절

저는 '스파이더' 라는 홈페이지 제작 동아리에 반 강제적으로 들어갔습니다. (당시 학과 선배의 권유?)

사실 저는 컴퓨터 동아리가 아닌 그냥 일반 학생들이 많은 동아리에 들어가고 싶었습니다. ㅠ.ㅠ

홈페이지 동아리라 홈페이지가 있는줄 알았는데... 홈페이지가 없더군요 헉!!!

그리고 홈페이지 동아리에서 평생 한번 강의를 해주셧는데..선배님들이...

기대하고 들었는데..  기본 HTML 만 알려주더라구요 충격!!! br, a href 등 중1때부터 지겹도록 써온것들만...

그래서 그냥 비공식적으로 비밀리에 제가 혼자 동아리 홈페이지를 만들기로 결심하였습니다.

당시에는 HTML5나 실버라이트가 없던 시절이라 플래시가 최강이였죠 일단 홈페이지 동아리에 걸맞게

HTML로만 만드는것을 배제하였습니다. 그리고 그때 당시에 유행했었던 제로보드,화이트 보드 등 게시판으로 도배하는

초보적인 짓도 하지 않기로 하였습니다. 

저는 그래서 당시에 플래시와 액션스크립트를 통해서 풀 홈페이지를 만들고 플래시안에 제로보드 등 외부 게시판을 연동하기가

좀그랬기때문에 제가 직접 만들었습니다.  mysql를 이용해서 데이터를 저장하고  플래시 게시판을 만들었었죠...

모방은 창조의 어머니라고 해서 그당시에 며칠동안 풀 플래시 홈페이지+게시판 을 많이 참고 하였었습니다.

하지만 너무 오래전이라 스크린샷이 없는게 아쉽네요.. 당시에 정말 화려하게 만든다고 만들었었는데 ㅠㅠ 

 
Posted by 동동(이재동)