반응형

* 본 문제와 풀이의 저작권은 매일프로그래밍에 있습니다.






정수 배열(int array)가 주어지면 가장 큰 이어지는 원소들의 합을 구하시오. 단, 시간복잡도는 O(n).



예제}


Input : [-1, 3, -1, 5]


Output : 7 // 3 + (-1) + 5



Input : [-5, -3, -1]


Output : -1 // -1



Input : [2, 4, -2, -3, 8]


Output : 9 // 2 + 4 + (-2) + (-3) + 8






반응형
반응형

사용자 환경 : macOS Sierra 10.12.6






PHP로 MySQL에 접근하는 예제를 여러 개 봤었다면 mysql과 mysqli를 봤었을 것이다.



본인도 처음 봤을 때 둘의 차이점에 대해 궁금증을 가지게 되었는데 생각보다 단순했다.



mysqli 키워드는 php5 버전 이후부터 지원되며 기존의 mysql 키워드보다 보안, 속도면에서 향상되었다.



또 하나, 작은 차이점은 mysql_query()와 mysqli_query()의 파라미터 값 순서가 다르다는 것이다.



1.mysql

<?php
	$connect=mysql_connect('localhost', 'root', 'PASSWORD');
	$db=mysql_select_db("DB_NAME", $connect);
?>





2. mysqli

<?php
	$conn=mysqli_connect('localhost', 'root', 'PASSWORD', 'DB_NAME');
?>





이와 같은 차이가 있다.



mysqli이 보안과 속도가 더 좋다고 하니 이를 사용하는 것이 좋겠다.

반응형

'Develop - > PHP' 카테고리의 다른 글

[Solution] PHP 전달된 파라미터 값 확인하기  (1) 2018.08.15
반응형

사용자 환경 : macOS Sierra 10.12.65.7.20 MySQL Community Server (GPL)






MySQL을 사용하다보면 한글을 입력하고 싶을 때가 있으나 기본적인 설정으로는 한글이 깨져 보인다.



이 문제를 해결해보고자 하며 여기에는 여러 방법이 있으나 그 중 일부만을 설명한다.





1. 데이터베이스 생성 시 설정

mysql> create database DB_NAME default character set utf8 collate utf8_general_ci;

DB_NAME은 데이터베이스명을 뜻한다.





2. 기존 생성되어 있는 데이터베이스의 설정

mysql> alter database DB_NAME default character set utf8 collate utf8_general_ci;





3. 테이블 생성 시 설정

mysql> create table TABLE_NAME (
    -> id int(4) primary key,
    -> ...
    -> ) default character set utf8 collate utf8_general_ci;

TABLE_NAME 역시 테이블명을 뜻한다.





4. 기존 생성되어 있는 테이블의 설정

mysql> alter table TABLE_NAME default character set utf8 collate utf8_general_ci;


반응형
반응형

사용자 환경 : macOS Sierra 10.12.6Android Studio 3.0.1 {

  Build #AI-171.4443003, built on November 10, 2017

  JRE: 1.8.0_152-release-915-b08 x86_64

  JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o

  }






이번에는 커스텀 리스트뷰에 대해 알아보고자 한다.



먼저 이 앱의 최종 화면은 다음과 같다.





각 아이템을 클릭 시 맨 우측에 좋아요 숫자가 올라가는 기능도 구현할 예정이다.



1. 프로젝트를 생성한다.




2. 해당 파일을 받고 앞축을 푼 후 android 폴더에 있는 다음 폴더들을 전부 복사한다.

ic_thumb_up_black_18dp.zip



2-1. 다시 안드로이드 스튜디오로 돌아와 프로젝트 뷰로 변경 후 다음 경로를 찾아 복사한다.





2-2. res 폴더를 클릭후 복사(Ctrl + v)한다.



이로써 개발에 앞서 모든 준비가 완료되었다. 본격적으로 코딩을 시작해보자.




3. 리스트뷰에 사용될 아이템을 지닌 클래스를 생성한다. ListviewItem.java

public class ListviewItem {

    private String strName;
    private int nId, nLike;

    public String getStdName() {
        return stdName;
    }

    public void setStrName(String strName) {
        this.strName = strName;
    }

    public int getId() {
        return nId;
    }

    public void setId(int nId) {
        this.nId = nId;
    }

    public int getLike() {
        return nLike;
    }

    public void setLike(int nLike) {
        this.nLike = nLike;
    }
}

line 3. strName은 최종 실행화면의 C, Java 등을 나타내는 제목이다.


line 4. nId, nLike는 역시 최종 실행화면의 맨 좌측과 우측의 숫자를 나타낸다.





4. 리스트뷰 레이아웃 설정한다. layout_listview.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:weightSum="1">

    <TextView
        android:id="@+id/txt_id"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="0.1"
        android:gravity="center"/>

    <TextView
        android:id="@+id/txt_name"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="0.7"
        android:textStyle="bold"
        android:gravity="center"/>

    <ImageView
        android:id="@+id/img_up"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="0.1"
        android:gravity="center"
        android:src="@drawable/ic_thumb_up_black_18dp"/>

    <TextView
        android:id="@+id/txt_like"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="0.1"
        android:gravity="center"/>
</LinearLayout>





5. 리스트뷰를 사용할 어댑터 클래스를 생성한다. ListviewAdapter.java

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import java.util.ArrayList;

public class ListviewAdapter extends BaseAdapter {

    private ArrayList<listviewitem> arrayList;
    private int nId;

    public ListviewAdapter() {
        arrayList = new ArrayList<listviewitem>();
        nId = 0;
    }

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        final Context context = viewGroup.getContext();

        ListviewItem listItem = arrayList.get(i);

        if (view == null) {
            LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = inflater.inflate(R.layout.layout_listview, viewGroup, false);
        }

        TextView id = (TextView)view.findViewById(R.id.txt_id);
        TextView name = (TextView)view.findViewById(R.id.txt_name);
        TextView like = (TextView)view.findViewById(R.id.txt_like);

        id.setText(String.valueOf(listItem.getId()));
        name.setText(listItem.getStdName());
        like.setText(String.valueOf(listItem.getLike()));

        return view;
    }

    public void addItem(String name) {
        ListviewItem item = new ListviewItem();

        item.setId(++nId);
        item.setStdName(name);
        item.setLike(0);

        arrayList.add(item);
    }

    @Override
    public int getCount() {
        return arrayList.size();
    }

    @Override
    public Object getItem(int i) {
        return arrayList.get(i);
    }

    @Override
    public long getItemId(int i) {
        return i;
    }
}





6. activity_main.xml을 레이아웃 설정한다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.ahn.customlistview.MainActivity">

    <ListView
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </ListView>

</LinearLayout>





7. 마지막으로 메인 액티비티에서 기능을 구현해보자.

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;

public class MainActivity extends AppCompatActivity {

    private String[] lang = {
            "C",
            "Java",
            "PHP",
            "Swift"
    };

    private ListView listView;
    private ListviewAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        adapter = new ListviewAdapter();

        listView = (ListView)findViewById(R.id.listview);
        listView.setAdapter(adapter);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView parent, View v, final int position, long id) {
                // get item
                ListviewItem item = (ListviewItem)parent.getItemAtPosition(position);

                int getLike = item.getLike();
                item.setLike(++getLike);
                adapter.notifyDataSetChanged();
            }
        });

        initList();
    }

    public void initList() {
        for(int i=0; i<lang.length; i++) {
            adapter.addItem(lang[i]);
            adapter.notifyDataSetChanged();
        }
    }
}

line 9~14. 리스트뷰에 사용될 아이템 제목들이다.


line 27. 전에 생성했던 어댑터를 리스트뷰에 세팅한다.


line 32. 리스트를 클릭 시 해당 아이템의 번호를 인덱스로 하여 참조를 얻는다.


line 34~36. 좋아요를 +1 시키는 작업을 하고나서 데이터가 변경되었음을 알린다.


line 43. C, Java 등을 리스트에 추가한다.





이로써 커스텀 리스트뷰를 사용할 수 있게 되었다.

반응형
반응형

사용자 환경 : macOS Sierra 10.12.65.7.20 MySQL Community Server (GPL)






데이터베이스를 구축하다보면 테이블 이름을 잘 못 만들었거나, 엉뚱한 데이터베이스에 만드는 경우가 가끔 생긴다.



본인은 쿼리문을 잘 몰랐을 때 이런 상황에서 다시 만들었던 기억이 있다... ):



이와 같은 실수를 하는 사람이 없길 바라며 이번 글을 포스팅하게 되었다.





1. 테이블 이름 변경 및 이동

mysql> alter table 변경전테이블이름 rename 변경할테이블이름;

이와 같은 쿼리문을 이용하여 이동 또한 가능하다.



예를 들어 A 데이터베이스에 있는 test라는 테이블을 B 데이터베이스로 이동시키고 싶다면 다음과 같이 작성할 수 있다.

mysql> alter table A.test rename B.test;





2. 테이블 복사

mysql> create table 생성될테이블 like 기존테이블;

다른 데이터베이스에 있는 테이블 또한 복사가 가능하다.



예를 들어 A 데이터베이스에 있는 test 테이블을 C 데이터베이스에 복사하려고 한다면 다음과 같이 작성할 수 있다.

mysql> create tabke C.test like A.test;


insert 구문을 이용한 방법도 있다.

mysql> insert into 입력할테이블 select * from 복사될테이블;


마찬가지로 A 데이터베이스에 있는 test 테이블을 C 데이터베이스에 복사하려고 한다면 다음과 같이 작성할 수 있다.

mysql> insert into C.test select * from A.test;






반응형
반응형

사용자 환경 : macOS Sierra 10.12.6Android Studio 3.0.1 {

  Build #AI-171.4443003, built on November 10, 2017

  JRE: 1.8.0_152-release-915-b08 x86_64

  JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o

  }






현재 로그인 시스템이 구현되어 있는 대부분의 앱에는 자동 로그인 기능이 구현되어 있다.



자동 로그인 기능이 구현되어 있지 않은 앱을 사용해본 경험이 있다면 이 기능을 사용함으로써 앱이 많은 편리함을 가져다 준다는 것을 알 수 있다.



이 기능을 구현하기 위해 우리는 SharedPreference API를 사용할 것이다.



1. 가장 먼저 정보를 저장하기 위한 메소드를 내장한 클래스를 구현한다.

import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;

public class SaveSharedPreference {

    static final String PREF_USER_NAME = "username";

    static SharedPreferences getSharedPreferences(Context ctx) {
        return PreferenceManager.getDefaultSharedPreferences(ctx);
    }

    // 계정 정보 저장
    public static void setUserName(Context ctx, String userName) {
        SharedPreferences.Editor editor = getSharedPreferences(ctx).edit();
        editor.putString(PREF_USER_NAME, userName);
        editor.commit();
    }

    // 저장된 정보 가져오기
    public static String getUserName(Context ctx) {
        return getSharedPreferences(ctx).getString(PREF_USER_NAME, "");
    }

    // 로그아웃
    public static void clearUserName(Context ctx) {
        SharedPreferences.Editor editor = getSharedPreferences(ctx).edit();
        editor.clear();
        editor.commit();
    }
}

line 7. key 값에 해당된다.


line 9~11. 모든 액티비티에서 인스턴스를 얻기 위한 메소드이다.


line 14~18. 로그인 시 자동 로그인 여부에 따라 호출 될 메소드이다. userName이 저장된다.


line 21~23. 현재 저장된 정보를 가져오기 위한 메소드이다.


line 26~30. 자동 로그인 해제 및 로그아웃 시 호출 될 메소드이다.





2. 자동 로그인 여부를 체크할 인증용 액티비티 생성.

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

public class FirstAuthActivity extends AppCompatActivity {

    private Intent intent;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_first_auth);

        if(SaveSharedPreference.getUserName(FirstAuthActivity.this).length() == 0) {
            // call Login Activity
            intent = new Intent(FirstAuthActivity.this, LoginActivity.class);
            startActivity(intent);
            this.finish();
        } else {
            // Call Next Activity
            intent = new Intent(FirstAuthActivity.this, HomeActivity.class);
            intent.putExtra("STD_NUM", SaveSharedPreference.getUserName(this).toString());
            startActivity(intent);
            this.finish();
        }
    }
}

line 15~20. SharedPreference에 저장되어 있는 정보의 길이가 0일 경우, 즉 없을 경우 로그인 액티비트를 호출한다.


line 20~26. 나머지 경우, 즉 저장되어 있는 정보가 있을 경우 바로 로그인 다음 액티비티를 호출한다.





3. 자동 로그인 설정 시 사용할 코드

SaveSharedPreference.setUserName(LoginActivity.this, editId.getText().toString());

로그인 액티비티에서 자동 로그인 설정과 함께 로그인 시 EditText의 값을 SaveSharedPrefernce.setUserName(Context, String) 메소드를 통해 저장.

반응형
반응형

사용자 환경 : macOS Sierra 10.12.65.7.20 MySQL Community Server (GPL)





우선 root 패스워드를 잊어버려서는 안되지만 사람은 실수를 하기에..




1. 먼저 MySQL 데몬을 정지시킨다.

$> /usr/local/mysql/support-files/mysql.server stop





2. 패스워드를 생략하여 접속할 수 있는 안전 모드로 진입한다.

$> /usr/bin/mysqld_safe --skip-grant-tables &





3. MySQL에 비밀번호 없이 접속한다.

$> /usr/local/mysql/bin/mysql -uroot





4. 패스워드를 변경한다. (5.7버전을 기준으로 명령어가 다르니 자세히 보자)


5.7버전 미만

mysql> update mysql.user set password=password('패스워드') where user='root'; 
mysql> flush privileges;
mysql> quit

5.7버전 이상

mysql> update mysql.user set authentication_string =password('패스워드') where user='root'; 
mysql> flush privileges;
mysql> quit





5. MySQL 데몬을 재시작한다.

$> /usr/local/mysql/support-files/mysql.server restart





이제 접속해보면 문제 없이 진입 될 것이다.

반응형
반응형


사용자 환경 : macOS Sierra 10.12.65.7.20 MySQL Community Server (GPL)





MySQL에 접속을 시도하다 보면 다음과 같은 에러문을 쉽게 볼 수 있을 것이다.

$> /usr/local/mysql/bin/mysql
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
$> /usr/local/mysql/bin/mysql -uroot -p잘못된비밀번호
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
위에 두 에러의 차이점을 보자면, 마지막 단어인 using password: 부분이 각각 YES, NO로 되어있다.



그럼 두 에러를 하나씩 살펴보자.



$> /usr/local/mysql/bin/mysql
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
위 에러는 비밀번호를 입력하지 않았을 경우 나타는 에러이다.
-p 옵션을 사용하여 옳바른 비밀번호를 입력하면 된다.



$> /usr/local/mysql/bin/mysql -uroot -p잘못된비밀번호
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

위 에러는 -p 옵션을 사용하여 비밀번호를 입력했지만, 옳바르지 않은 비밀번호를 입력했을 경우 나타는 에러이다.

옳바른 비밀번호를 입력 시 다음과 같은 화면이 출력된다.

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 5.7.20 MySQL Community Server (GPL)

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>


반응형

+ Recent posts