AndroidManifest.xml 파일 수정


아래 versionCode와 versionName 을 기존 출시한 숫자보다 높여서 수정


<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

    package="com.kimhae.net.ellord"

    android:versionCode="1"

    android:versionName="1.0" >


아래처럼


<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

    package="com.kimhae.net.ellord"

    android:versionCode="2"

    android:versionName="1.1" >



블로그 이미지

엘로드넷

,

1. 개별 테이블 조회


SELECT 

    table_name AS `Table`, 

    round(((data_length + index_length) / 1024 / 1024), 2) `Size in MB` 

FROM information_schema.TABLES 

WHERE table_schema = "DB명"

    AND table_name = "테이블명";



2. 테이블 전체 조회


해당 디비 선택 후,


SELECT 

     table_schema as `Database`, 

     table_name AS `Table`, 

     round(((data_length + index_length) / 1024 / 1024), 2) `Size in MB` 

FROM information_schema.TABLES 

ORDER BY (data_length + index_length) DESC;




블로그 이미지

엘로드넷

,

/etc/resolv.conf 에 설정된 dns서버 원인


dns서버를 아래와 같이 변경


nameserver 168.126.63.1

nameserver 168.126.63.2





'MySQL, MariaDB' 카테고리의 다른 글

order by field ()  (0) 2016.03.14
MySQL 테이블 사이즈 조회  (0) 2016.01.13
too many connections, max_connections, wait_timeout  (0) 2016.01.13
MySQL 5.7.9 root 비밀번호 재설정  (1) 2015.12.02
MSQL Locked 확인 및 죽이기  (0) 2015.07.23
블로그 이미지

엘로드넷

,

MySQL too many connections 에러시



1. max_connectons 값 조절


mysql> show global variables like 'max%';

+----------------------------+------------+

| Variable_name              | Value      |

+----------------------------+------------+

| max_allowed_packet         | 1048576    |

| max_binlog_cache_size      | 4294963200 |

| max_binlog_size            | 104857600  |

| max_connect_errors         | 10         |

| max_connections            | 512        |

| max_delayed_threads        | 20         |

| max_error_count            | 64         |

| max_heap_table_size        | 16777216   |

| max_insert_delayed_threads | 20         |

| max_join_size              | 4294967295 |

| max_length_for_sort_data   | 1024       |

| max_long_data_size         | 1048576    |

| max_prepared_stmt_count    | 16382      |

| max_relay_log_size         | 0          |

| max_seeks_for_key          | 4294967295 |

| max_sort_length            | 1024       |

| max_sp_recursion_depth     | 0          |

| max_tmp_tables             | 32         |

| max_user_connections       | 0          |

| max_write_lock_count       | 4294967295 |

+----------------------------+------------+

20 rows in set (0.00 sec)



512 로 되어 있는 것을 1024로 늘리자.



mysql> set @@global.max_connections = 1024;



적용되었는지 화인



mysql> show global variables like 'max%';

+----------------------------+------------+

| Variable_name              | Value      |

+----------------------------+------------+

| max_allowed_packet         | 1048576    |

| max_binlog_cache_size      | 4294963200 |

| max_binlog_size            | 104857600  |

| max_connect_errors         | 10         |

| max_connections            | 1024       |

| max_delayed_threads        | 20         |

| max_error_count            | 64         |

| max_heap_table_size        | 16777216   |

| max_insert_delayed_threads | 20         |

| max_join_size              | 4294967295 |

| max_length_for_sort_data   | 1024       |

| max_long_data_size         | 1048576    |

| max_prepared_stmt_count    | 16382      |

| max_relay_log_size         | 0          |

| max_seeks_for_key          | 4294967295 |

| max_sort_length            | 1024       |

| max_sp_recursion_depth     | 0          |

| max_tmp_tables             | 32         |

| max_user_connections       | 0          |

| max_write_lock_count       | 4294967295 |

+----------------------------+------------+

20 rows in set (0.00 sec)


mysql> 


1024로 변경되어 있다.



2. wait_timeout 확인


mysql> show global variables like 'wait%';

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| wait_timeout  | 28800 |

+---------------+-------+

1 row in set (0.00 sec)


mysql> 


28800 으로 되어 있는 것을 60으로 바꾸자


mysql> set @@global.wait_timeout = 60;



변경되었는지 확인

mysql> show global variables like 'wait%';

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| wait_timeout  |  60   |

+---------------+-------+

1 row in set (0.00 sec)


mysql> 



변경되어 있다.




3. unauthenticated user 삭제


processlist 에서 unauthenticated user 사용자 리스트를 삭제하는 텍스트 파일로 저장하고


mysql> select concat('KILL ', ID, ';') from information_schema.processlist where user='unauthenticated user' and command='query'  into outfile '/tmp/kill_list.txt';



한번에 실행시킨다

mysql> \. /tmp/kill_list.txt   









블로그 이미지

엘로드넷

,




MySQL-5.7.10 설치


1. cmake  가 필요하므로 설치한다



[root@localhost src]# yum -y install cmake






2. boot가 필요하므로 설치한다.


[root@localhost src]# wget http://sourceforge.net/projects/boost/files/boost/1.60.0/boost_1_60_0.tar.gz




압축을 푼다


[root@localhost src]# tar xvfz boost_1_60_0.tar.gz




소스디렉토리로 가서 


bootstrap.sh을 실행한다


[root@localhost boost_1_60_0]#./bootstrap.sh




boost가 설치된 경로를 확인해 본다.


[root@localhost boost_1_60_0]#whereis boost

/usr/include/boost







3. MySQL5.7.10 을 다운받는다.

다운받을 파일 mysql-5.7.10.tar.gz


압축을 푼다.


[root@localhost src]# tar xvfz mysql-5.7.10.tar.gz





4. 소스 디렉토리로 간다.


[root@localhost src]# cd mysql-5.7.10




cmake configure시 아까 확인한 boost경로를 아래와 같이 설정해 준다.


cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/data -DENABLED_LOCAL_INFILE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DSYSCONFDIR=/etc -DDEFAULT_CHARSET=utf8 -DMYSQL_TCP_PORT=3306 -DWITH_EXTRA_CHARSETS=all -DDEFAULT_COLLATION=utf8_general_ci -DDOWNLOAD_BOOST=1 -DWITH_BOOST=/usr/include/boost


컴파일 한다.


[root@localhost mysql-5.7.10]# make


중략



[ 34%] Building CXX object storage/innobase/CMakeFiles/innobase_embedded.dir/trx/trx0rseg.cc.o

[ 34%] Building CXX object storage/innobase/CMakeFiles/innobase_embedded.dir/trx/trx0sys.cc.o

[ 34%] Building CXX object storage/innobase/CMakeFiles/innobase_embedded.dir/trx/trx0trx.cc.o

[ 34%] Building CXX object storage/innobase/CMakeFiles/innobase_embedded.dir/trx/trx0undo.cc.o



중략







[root@localhost mysql-5.7.10]# make install




초기 데이타베이스 설치 



[root@localhost client]# ./mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data




데몬 구동


[root@localhost client]# /usr/local/mysql/bin/mysqld_safe --user=mysql &




끝.









'Linux' 카테고리의 다른 글

CentOS 7 iptables 설정  (1) 2016.01.15
CentOS 7 APM yum 설치 MariaDB  (11) 2016.01.15
CentOS 7 network prefix  (0) 2015.12.04
리눅스 NFS설정  (0) 2015.09.25
CentOS 7 apm 소스설치, 방화벽 적용  (4) 2015.07.23
블로그 이미지

엘로드넷

,

사파리에서 모든 브라우저 테스트 해보기


사파리에서 커맨드+옵션+r  (Command+Option+r) 키를 눌러 보자


아래와 같은 화면으로 바뀔 것이다.



아래 그림처럼 상단에서 화면해상도, 배율, 그리고 각종 브라우저들을 선택할 수 있다.




원래대로 돌아오려면 다시 커맨드+옵션+r 을 누르면 된다.








블로그 이미지

엘로드넷

,

//숫자에 콤마 찍기

function set_comma(n){

   var reg=/(^[+-]?\d+)(\d{3})/;

   n+='';

   while(reg.test(n))

   n=n.replace(reg,'$1'+','+'$2');

   return n;

  }

  



var testvalue = 10000;

var commavalue = set_comma(test value);



블로그 이미지

엘로드넷

,

3개의 webview xml을 3개의 viewpager 에 각각 띄우기

각각의 웹뷰에서 자바스크립트 변수 넘길 수 있도록





1. main_layout.xml


    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:orientation="vertical" >


<LinearLayout 

   android:id="@+id/ll_title_layout"

   android:layout_width="fill_parent"

   android:layout_height="30dip"

   >

    <Button

        android:id="@+id/btn_one"

        android:layout_width="140dip"

     android:layout_height="30dip"

     android:text="ViewPager1"

     android:textSize="16sp"

     android:textColor="#FFFFFF"

     android:layout_marginLeft="5dp"

     android:layout_marginRight="5dp"

   

        />

    <Button

        android:id="@+id/btn_two"

        android:layout_width="100dip"

     android:layout_height="30dip"

     android:text="ViewPager2"

     android:textSize="16sp"

     android:layout_marginRight="5dp"

   

    />

    <Button

        android:id="@+id/btn_three"

        android:layout_width="100dip"

     android:layout_height="30dip"

     android:text="ViewPager3"

     android:textSize="16sp"

  

      />

</LinearLayout> 

               


        <android.support.v4.view.ViewPager

            android:id="@+id/pager"

            android:layout_width="match_parent"

            android:layout_height="750dp" />


</LinearLayout> 




2. webview 레이아웃 3개


inflate_one.xml

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:id="@+id/inflate_one"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    android:orientation="vertical" 

    >

    <WebView

        android:id="@+id/webView1"

        android:layout_width="match_parent"

        android:layout_height="750dp"

        />

   

         

</RelativeLayout>




inflate_two.xml

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:id="@+id/inflate_one"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    android:orientation="vertical" 

    >

    <WebView

        android:id="@+id/webView2"

        android:layout_width="match_parent"

        android:layout_height="750dp"

        />

   

         

</RelativeLayout>




inflate_three.xml

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:id="@+id/inflate_one"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    android:orientation="vertical" 

    >

    <WebView

        android:id="@+id/webView3"

        android:layout_width="match_parent"

        android:layout_height="750dp"

        />

   

         

</RelativeLayout>







3. MainActivity.java


public class MainActivity extends FragmentActivity implements OnRefreshListener {


private ViewPager mPager;

WebView web;



@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main_layout);


mPager = (ViewPager)findViewById(R.id.pager);

mPager.setAdapter(new PagerAdapterClass(getApplicationContext()));


//viewpager의 현재 위치 

mPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {

            @Override

            public void onPageSelected(int position) {

   //여기에 할일

            }

        });




//버튼으로 viewpager이동하기

       Button btn_one = (Button)findViewById(R.id.btn_one);

       Button btn_two = (Button)findViewById(R.id.btn_two);

       Button  btn_three = (Button)findViewById(R.id.btn_three);

        

        btn_one.setOnClickListener(new OnClickListener(){

public void onClick(View v){

setCurrentInflateItem(0);

}

    });

        btn_two.setOnClickListener(new OnClickListener(){

        public void onClick(View v){

         setCurrentInflateItem(1);

        }

        });

        

        btn_three.setOnClickListener(new OnClickListener(){

        public void onClick(View v){

         setCurrentInflateItem(2);

        }

        });

        




}




//viewpager 이동 

private void setCurrentInflateItem(int type){

if(type==0){

mPager.setCurrentItem(0);

}else if(type==1){

mPager.setCurrentItem(1);

}else{

mPager.setCurrentItem(2);

 

}


}




//Pager 어댑터

private class PagerAdapterClass extends PagerAdapter{

private LayoutInflater mInflater;


public PagerAdapterClass(Context c){

super();

mInflater = LayoutInflater.from(c);

}


@Override

public int getCount() {

return 3;

}


@Override

public Object instantiateItem(View pager, int position) {

View v = null;

    if(position==0){//첫번째 뷰페이저

    v = mInflater.inflate(R.layout.inflate_one, null);

    

 

String url_web1 = "http://www.test.com/test_web1.html";

    WebView web1 = (WebView)v.findViewById(R.id.webView1);

       

    

    WebSettings set1 = web1.getSettings();

    set1.setJavaScriptEnabled(true);

    set1.setAllowFileAccess(true);

            web1.loadUrl(url_web1);

 web1.addJavascriptInterface(this, "android");

            web1.addJavascriptInterface(new JavaScriptInterface(web2.getContext()), "android");

    


    }

    else if(position==1){

    v = mInflater.inflate(R.layout.inflate_two, null);

     final String url_web2 = "http://www.test.com/test_web2.html";

     final WebView web2 = (WebView)v.findViewById(R.id.webView2);


     WebSettings set2 = web2.getSettings();

    set2.setJavaScriptEnabled(true);    

          web2.loadUrl(url_web3);

     web2.addJavascriptInterface(this, "android");

            web2.addJavascriptInterface(new JavaScriptInterface(web2.getContext()), "android");

   

    


    }else{

    v = mInflater.inflate(R.layout.inflate_three, null);

    

     final String url_web3 = "http://www.test.com/test_web3.html";

     final WebView web3 = (WebView)v.findViewById(R.id.webView3);


     WebSettings set3 = web3.getSettings();

     set3.setJavaScriptEnabled(true);    

          web3.loadUrl(url_web3);

     web3.addJavascriptInterface(this"android");

             web3.addJavascriptInterface(new JavaScriptInterface(web3.getContext()), "android");

    }

    

         

    ((ViewPager)pager).addView(v, 0);

    

    return v; 

}



@Override

public void destroyItem(View pager, int position, Object view) {

((ViewPager)pager).removeView((View)view);

}

@Override

public boolean isViewFromObject(View pager, Object obj) {

return pager == obj; 

}


@Override public void restoreState(Parcelable arg0, ClassLoader arg1) {}

@Override public Parcelable saveState() { return null; }

@Override public void startUpdate(View arg0) {}

@Override public void finishUpdate(View arg0) {}


}





//자바스크립트 인터페이스

public class JavaScriptInterface {


private Context mContext;

JavaScriptInterface(Context c){

mContext = c;

}


@JavascriptInterface  

public void viewTest(String id, String title) { //웹뷰 내에서 호출하는 자바스크립트 함수와 연동 정의

      Intent it = new Intent();

      it.setClass(MainActivity.this,  ViewActivity.class);

      it.putExtra("id", id);

      it.putExtra("title", title);


      startActivityForResult(it, 0);  


}  

}




}






4. test_web1.html ... 나머지 파일도 비슷하게..


<!doctype html>

<html lang="ko">

 <head>

  <meta charset="UTF-8">


<script>

function viewTest(id, title){

android.viewTest(id, title);//연동함수 호출

}


</script>

 </head>

 

 <body> 

<a href="viewTest('1','제목');">보기</a> 


 </body>

</html>

블로그 이미지

엘로드넷

,

빨간색 부분은 사용자 환경에 맞게 조정





1. 폼작성 페이지

<html>

<head></head>

<body>

<div >

<h1>GCM 메세지 전송</h1>

<form method="post" action="./gcm_send.php/?push=true" >                                                      

<input type="hidden" name="push" value="true">

<textarea rows="5" name="message" cols="45" placeholder="메세지 입력"></textarea> <br/>

<input type="submit"  value=" 전송하기 " />

</form>

</div>

    

    </body>

</html>






2. GCM전송 페이지 : gcm_send.php


<?php



//디비연결

include $_SERVER['DOCUMENT_ROOT'] . "/db_connect.php";



//GCM전송 함수 

     function sendMessageThroughGCM($registatoin_ids, $message) {

        $url = 'https://android.googleapis.com/gcm/send';

        $fields = array(

            'registration_ids' => $registatoin_ids,

            'data' => $message,

        );


define("GOOGLE_API_KEY", "구글API키값");

        $headers = array(

            'Authorization: key=' . GOOGLE_API_KEY,

            'Content-Type: application/json'

        );

        $ch = curl_init();

        curl_setopt($ch, CURLOPT_URL, $url);

        curl_setopt($ch, CURLOPT_POST, true);

        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);

        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));

        $result = curl_exec($ch);

        if ($result === FALSE) {

            die('Curl failed: ' . curl_error($ch));

        }

        curl_close($ch);

        return $result;

    }




//GCM메시지 전송

if(!empty($_POST["push"])) {

$pushMessage = $_POST["message"];

$pushMessage = urlencode($pushMessage);





//DB에서 전송할 기기아이디 조회

$reg_ids = array();

$sql = "SELECT and_reg_id FROM GCM_PUSH ";

$result = mysql_query($sql);

while($data = mysql_fetch_array($result)){

array_push($reg_ids, $data['and_reg_id']); 

}



$title = "GCM 알림!";

$title = urlencode($title);







  //JSON형태로 보냄 : 메세지 본문은 $pushMessage, 기타 값들을 추가해서 보낼 수 있다.

if (isset($reg_ids) && isset($pushMessage)) {

$message = array(

"ellord" => $pushMessage,

"extra" => $title


);

$pushStatus = sendMessageThroughGCM($reg_ids, $message);

}

}


?>



3. 기기에서 확인



끝.






블로그 이미지

엘로드넷

,

CentOS 7 network prefix

Linux 2015. 12. 4. 18:44

network 설정방법이 좀 달라졌음


[root@localhost network-scripts]# vi /etc/sysconfig/network-scripts/ifcfg-enp6s0



랜카드명이 eth0 에서 enp6s0 처럼 변경되었음. 



고정ip설정시 netmask 설정은 NETMASK, PREFIX 중에 하나만 사용해야 함. 

두 개 다 지정해 놓을 경우 PREFIX가 우선함


NETMASK = 255.255.255.224

PREFIX = 27


와 


PREFIX = 27

NETMASK = 255.255.255.224


는 동일하게 PREFIX값이 우선함


PREFIX 값을 주석처리하거나 삭제함



-----



서브넷 클래스에 따른 NETMASK / PREFIX 값 (둘 중 하나만 사용)


NETMASK = 255.255.255.0

PREFIX = 24

호스트범위 : 1~254



NETMASK = 255.255.255.128

PREFIX = 25

호스트범위 : 1~126



NETMASK = 255.255.255.192

PREFIX = 26

호스트범위 : 1~62



NETMASK = 255.255.255.224

PREFIX = 27

호스트범위 : 33~62



NETMASK = 255.255.255.240

PREFIX = 28

호스트범위 : 49~62



NETMASK = 255.255.255.248

PREFIX = 29

호스트범위 : 49~54



NETMASK = 255.255.255.252

PREFIX = 30

호스트범위 : 53~54











블로그 이미지

엘로드넷

,