카테고리 없음

230127

Berylly 2023. 1. 27. 20:22

T.김동식

인공지능
약인공지능: 현재
강인공지능: 사람을 지배하는, 영화상상

정규표현식
regular expression, 간단히 regexp 또는 regex, rational expression) 또는 정규식이라 불림.
스티븐 클레이니가 정규 집합(regular set)이라는 자신의 수학적 개념을 이용하여 정규 언어를 기술한 1956년이 기원
1992년 POSIX.2에 표준화된 초기 형태들을 이용하여 다양한 프로그램에 채택
특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어
텍스트패턴을 기술하기 위한, 패턴에 맞는 문자열을 검색할때 사용

https://regex101.com/

regex101: build, test, and debug regex

Regular expression tester with syntax highlighting, explanation, cheat sheet for PHP/PCRE, Python, GO, JavaScript, Java, C#/.NET.

regex101.com


[가-힣] 한글만 선택

. \n를 제외한 모든문자와 매치


* *앞에있는 문자가 0개~무한대로 반복될수있는


+ +앞에있는 문자가 1개~무한대로 반복될 수 있는



[] []안에있는 모든 문자들과 매치, - 범위



[0-9] = \d

[^0-9] = \D


[가-힣a-zA-Z0-9_] = \w


[^가-힣a-zA-Z0-9_] = \W


\s space 공백


\S space 가 아닌 모든것


*를하면 묶음으로 선택

공백선택

p태그 선택하기



POSIX(Portable Operating System Interface + X)
다른 운영체제들 사이의 호환성을 위해 IEEE에서 만든 표준
- Basic Regular Expressions(BRE)
- Extended Regular Expressions(ERE) -E



쿠키
팝업부터생성

//팝업레이아웃
<div class="popup">
    <p>알림팝업창입니다.</p>
    <form>
        <input type="checkbox" onclick="setPopUpStart(this)">
        <small>오늘 더이상 팝업창을 보지않습니다.</small>
    </form>
</div>
//notShowPopUp = true 보여주지않도록 쿠키값을 바꿔줌
function setPopUpStart(obj) {
        if(obj.checked ==true){
            var expireDate = new Date();
            expireDate.setDate(expireDate.getDate()+1);
            
            //var expireDate = new Date(); 날짜를 구해서
            //expireDate.setDate(expireDate.getDate()+1); 1일을 더한다.
            
            //체크박스가 체크되는 순간 expires=expireDate.toGMTString()을해서 쿠키을 생성+하루를세팅한다.
            document.cookie="notShowPopUp=" + "true" + ";path=/;expires=" + expireDate.toGMTString();
            
            //체크박스가 체크되는 순간 해당 창을 닫는다.
            window.close();
        }
    }

//쿠키삭제+popup불러오는 페이지 생성
<form action=""><input type="button" value="쿠키삭제" onclick="deleteCookie()"></form>
function getCookieValue() {

var result = "false"; //초기값세팅

// 쿠키가있을때 그 쿠키를 문자열로 돌려 notShowPopUp값이 있는지 확인후 그 value를 반환한다.
        if(document.cookie != ""){
            //document의 cookie 속성으로 쿠키정보를 문자열로 가져온뒤 ;로 분리해 각각의 쿠리를 얻는다.
            cookie = document.cookie.split(";");
            for(var i = 0; i<cookie.length;i++){
                element = cookie[i].split("=");
                value=element[0];
                value=value.replace(/^\s*/,''); //쿠키이름 문자열의 공백을 제거해 저장
                if(value == "notShowPopUp"){ //value가 notShowPopUp이면 해당하는 쿠키값을 가져와반환
                    result=element[1];
                }
            }
        }
        return result;
}
//onload될때 pageLoad수행
window.onload=pageLoad;
function pageLoad() {
notShowPopUp = getCookieValue(); //true or false

//캐시삭제안했을경우 띄우기 = false
if(notShowPopUp !="true"){
window.open("popup.html", "pop", "width="+popupWidth+", height="+popupHeight+", history=no, resizable=no, status=no, scrollbars=yes, memubar=no");
}}
//체크박스클릭시 생성했던 쿠키 값을 false로 바꾸고

//notShowPopUp=false
//쿠키삭제 Day를 -1해서 해당 쿠키설정시간을 리셋
function deleteCookie() {document.cookie = "notShowPopUp="+"false"+";path=/;expires=-1";}






세션
브라우저당하나씩 부여
기본값 30분


Server-context.xml 기본세팅

//톰캣에러, 톰캣 종료후에도 세션이 메모리에서 삭제되지않은경우를 대비하여 Manager 주석해제
 <Manager pathname="" />

Server-web.xml 에서 세션 기본값을 수정가능

  <!-- ==================== Default Session Configuration ================= -->
  <!-- You can set the default session timeout (in minutes) for all newly   -->
  <!-- created sessions by modifying the value below.                       -->

    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>


//현재 세션을 가져와 출력해본다.
HttpSession session = request.getSession();//org.apache.catalina.session.StandardSessionFacade@42832a9c
System.out.println(session.getId());//EC25246A649B7F5CEC2CD92611F98BE9
//생성날짜 알아보기
System.out.println(new Date(session.getCreationTime())); //Fri Jan 27 12:41:20 KST 2023
//마지막 접속시간 알아보기
System.out.println(new Date(session.getLastAccessedTime()));//Fri Jan 27 12:48:15 KST 2023
//세션시간 알아보기
System.out.println(session.getMaxInactiveInterval()); //1800
세션을 초기화해 출력해본다.
session.invalidate(); //5A7744625D6EF50E898A6AD5F7C856CD
//브라우저별로 확인

//크롬
//		org.apache.catalina.session.StandardSessionFacade@2723ac10
//		EC25246A649B7F5CEC2CD92611F98BE9
//		Fri Jan 27 12:41:20 KST 2023
//		Fri Jan 27 12:48:15 KST 2023
//		1800
		
		//엣지
//		org.apache.catalina.session.StandardSessionFacade@2d94b375
//		1504A2EA126DEB34C0CC11CA4C9268AF
//		Fri Jan 27 12:43:09 KST 2023
//		Fri Jan 27 12:48:46 KST 2023
//		1800



세션 예제

//로그인 화면구현, post방식으로 login으로 action한다.
<form name="form" action="login" method="post">
        <h1>login</h1>
        
        <p><span>아이디</span><input type="text" name="user_id"><br></p>
        <p><span>비밀번호</span><input type="password" name="user_pw"><br></p>

        <br>
       

        <input type="submit" value="로그인">
        <input type="reset" value="초기화">
        
         <input type="hidden" name="address" value="모란역" id="">
        <input type="hidden" name="email" value="sh@sanghee.com" id="">
        <input type="hidden" name="hp" value="010-2574-2411" id="">
        
    </form>
// WebServlet("/login"), doGet/doPost 모두 doHandle로 실행
protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doHandle(request, response);
	}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doHandle(request, response);
	}



protected void doHandle(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
            
//텍스트를 잘 출력할 수 있도록 기본값
response.setContentType("text/html; charset=utf-8");
PrintWriter out = response.getWriter();
//세션과 id, pw를 가져와 변수에 저장한다.
HttpSession session = request.getSession();
String user_id = request.getParameter("user_id");
String user_pw = request.getParameter("user_pw");
//첫 접속인 경우

if(session.isNew()) {
//			if(user_id != null & user_id.length() != 0) {
			if(user_id != null) {//id를 잘 입력했다면
				session.setAttribute("user_id", user_id); //추후 재접속때이용할 수 있도록 세션에 저장하고
				out.print("아이디: "+user_id + "<br>"+ user_id.length());//화면으로 보여준다.			
				System.out.println(user_id);
			}else{
            //id를 입력하지않았을경우 안내 + 세션을 초기화한다.
				out.print("<a href='login2.html' target='_blank'>다시 로그인하세요!</a>");
				session.invalidate();
			}
            
            
//재접속인 경우
		}else {
			if(user_id != null & user_id.length() != 0) {//id를 잘 입력했는지 확인 후 
				user_id=(String)session.getAttribute("user_id");//세션에 저장한 id를 불러와
				out.print("재요청시, 안녕하세요, "+user_id+"님");//화면으로 보여준다.
			}else {
            ///id를 입력하지않았을경우 안내 + 세션을 초기화한다.
				out.print("<a href='login2.html' target='_blank'>재요청시, 다시 로그인하세요!</a>");
				session.invalidate();
			}
		}










Android Studio

import를 자동으로 해오도록하여 개발시간을 단축하는 세팅


레이아웃 잡기 연습




여러java/xml생성후 테스트하는 방법
앱을 만들어 테스트 할때마다 프로젝트를 만들기 번거롭다.
manifests - AndroidManifest.xml - activity - android:name을 해당 java이름으로 변경



기본세팅된 앱 색이 마음에 안들어 변경했었다.
res - values - themes - themes.xml




안드로이드앱 - 이미지 선택하기

//화면을 모두 구현후 단계별로 구별해 첫단계 빼고는 invisible처리

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:padding="20dp" >

    <TextView
        android:id="@+id/Text1"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:text="선택을 시작하겠습니까?"
        android:textSize="20dp" />

    <Switch
        android:id="@+id/switchAgree"
        android:layout_weight="1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="시작함" />

    <TextView
        android:id="@+id/Text2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="좋아하는 안드로이드 버전은?"
        android:textSize="20dp"
        android:visibility="invisible" />

    <RadioGroup
        android:id="@+id/Rgroup1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:visibility="invisible">

        <RadioButton
            android:id="@+id/Rdo100"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Q(10.0)" />

        <RadioButton
            android:id="@+id/Rdo110"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="R(11.0)" />

        <RadioButton
            android:id="@+id/Rdo120"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="S(12.0)" />
    </RadioGroup>

    <ImageView
        android:id="@+id/ImgIcon"
        android:layout_width="120dp"
        android:layout_height="120dp"
        android:scaleType="fitCenter"
        android:visibility="invisible" />

    <Button
        android:id="@+id/BtnQuit"
        android:layout_width="370dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="종료"
        android:visibility="invisible" />

    <Button
        android:id="@+id/BtnRerun"
        android:layout_width="372dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="처음으로"
        android:visibility="invisible" />

</LinearLayout>

//각 사용될 타입과 각각의 변수지정
public class MainActivity_photoSelect extends AppCompatActivity {

    TextView text1, text2;
    Switch switchAgree;
    RadioGroup rGroup1;
    RadioButton radioArray[] = new RadioButton[3];//RadioButton들을 저장할 배열과 그 자리를 만듬
    ImageView imgPet;
    Button btnQuit, btnRerun;
//setTitle 지정
@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //MainActivity_photoSelect
        setContentView(R.layout.activity_main);
        setTitle("안드로이드 사진 보기");
// 위젯을 변수에 대입

//접속시 보이는 영역
text1 = (TextView) findViewById(R.id.Text1);
switchAgree = (Switch) findViewById(R.id.switchAgree);

//두번째 질문과 radio그룹, 각각의 radio는 배열값에 세팅
text2 = (TextView) findViewById(R.id.Text2);
rGroup1 = (RadioGroup) findViewById(R.id.Rgroup1);
radioArray[0] = (RadioButton) findViewById(R.id.Rdo100);
radioArray[1] = (RadioButton) findViewById(R.id.Rdo110);
radioArray[2] = (RadioButton) findViewById(R.id.Rdo120);

//이미지
imgPet = (ImageView) findViewById(R.id.ImgIcon);

//버튼
btnQuit = (Button) findViewById(R.id.BtnQuit);
btnRerun = (Button) findViewById(R.id.BtnRerun);
// 동의함 체크박스의 체크가 변경되면

switchAgree.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton arg0,boolean arg1) {

// 체크되면 숨겨놨던 레이아웃들이 모두 보이도록
if (switchAgree.isChecked() == true) {
 text2.setVisibility(View.VISIBLE);
rGroup1.setVisibility(View.VISIBLE);
imgPet.setVisibility(View.VISIBLE);
btnQuit.setVisibility(View.VISIBLE);
btnRerun.setVisibility(View.VISIBLE);

//반대
} else {
text2.setVisibility(View.INVISIBLE);
rGroup1.setVisibility(View.INVISIBLE);
imgPet.setVisibility(View.INVISIBLE);
btnQuit.setVisibility(View.INVISIBLE);
btnRerun.setVisibility(View.INVISIBLE);
}} });
//drawable에 저장한 이미지들을배열에 저장
final int draw[] = { R.drawable.q10,R.drawable.r11, R.drawable.s12};
//위에서 생성한 배열의 길이만큼만 돌릴것.
for (int i = 0; i < radioArray.length; i++) {
            final int index; // 주의! 꼭 필요함.
            index = i;
            
            //각 라디오가 클릭됬을때
            radioArray[index].setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                
                //imgPet 이미지영역 resource는 draw에 저장한 이미지이름으로 바뀔것.
                    imgPet.setImageResource(draw[index]);
                }
            });
        }
// 종료 버튼을 클릭하면 앱이 꺼짐
        btnQuit.setOnClickListener(new View.OnClickListener() {
            public void onClick(View arg0) {
                finish();
            }
        });
// 처음으로 버튼을 클릭하면
        btnRerun.setOnClickListener(new View.OnClickListener() {
            public void onClick(View arg0) {
            
            //visible했던 1단계를 제외한 모든 레이아웃을 다시 invisible
                text2.setVisibility(View.INVISIBLE);
                rGroup1.setVisibility(View.INVISIBLE);
                imgPet.setVisibility(View.INVISIBLE);
                btnQuit.setVisibility(View.INVISIBLE);
                btnRerun.setVisibility(View.INVISIBLE);

			//rGroup1안의 모든 radio도 초기화 + 시작함을 체크했던것도 초기화
                rGroup1.clearCheck();
                switchAgree.setChecked(false);

            }
        });







안드로이드앱 - 이미지 옮기기

<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="fill_parent"
    android:layout_height="fill_parent"
    android:background="@color/material_dynamic_neutral70"
    android:orientation="vertical"
    android:padding="20dp">

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:background="@color/white">

        <ImageView
            android:id="@+id/view_t"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:srcCompat="@drawable/q10" />
    </ScrollView>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="50dp">

        <Button
            android:id="@+id/send"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="▲" />

        <Button
            android:id="@+id/close"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="▼" />

    </LinearLayout>

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:background="@color/white">

        <ImageView
            android:id="@+id/view_b"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:visibility="invisible"
            app:srcCompat="@drawable/q10" />
    </ScrollView>
</LinearLayout>
public class MainActivity_photoMove extends AppCompatActivity {

	//변수설정
    Button top;
    Button down;

    ImageView view_t;
    ImageView view_b;
//setTitle 타이틀 설정하기
@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main0);
        setTitle("안드로이드 사진 옮기기");
//각 객체 잡기
top=findViewById(R.id.send);
down=findViewById(R.id.close);
view_t=findViewById(R.id.view_t);
view_b=findViewById(R.id.view_b);
//위쪽화살표를 눌렀을때
//setImageResource 이미지 리소스를 바꾸기
//setVisibility view_t은 보여주되, view_b는 INVISIBLE

top.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                view_t.setImageResource(R.drawable.q10);
                view_t.setVisibility(View.VISIBLE);
                view_b.setVisibility(View.INVISIBLE);
            }
        });
//아래쪽화살표를 눌렀을때
//setImageResource 이미지 리소스를 바꾸기
//setVisibility view_b은 보여주되, view_t은 INVISIBLE

down.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                view_b.setImageResource(R.drawable.q10);
                view_b.setVisibility(View.VISIBLE);
                view_t.setVisibility(View.INVISIBLE);
            }
        });




안드로이드앱 - Toast + 텍스트 옮기기 - xml없이 구현하기

//주석처리
@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.activity_main_txtmove);
//LinearLayout 설정값 세팅
//LinearLayout에 LayoutParams을 세팅하고 parms변수에 저장
LinearLayout.LayoutParams parms = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.MATCH_PARENT,
                LinearLayout.LayoutParams.MATCH_PARENT
        );
//LinearLayout생성
LinearLayout baseLayout = new LinearLayout(this);

//생성한 baseLayout의 정렬방식설정
baseLayout.setOrientation(LinearLayout.VERTICAL);

//생성한 baseLayout의 background 설정
baseLayout.setBackgroundColor(Color.rgb(200, 200, 200));

//세팅한 baseLayout에 설정값 적용해 생성
setContentView(baseLayout,parms);
//Button 생성
Button btn = new Button(this);

//value 생성
btn.setText("클릭하면 알림이 뜹니다");

//background 설정
btn.setBackgroundColor(Color.rgb(150, 150, 150));

//생성한 baseLayout에 addView 추가
baseLayout.addView(btn);
//위 btn을 클릭했을때
btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
            
            //Toast출력
                Toast.makeText(getApplicationContext(), "코드로 생성한 버튼입니다.", Toast.LENGTH_SHORT).show();
            }
        });
//EditText 생성 후 레이아웃에 추가
EditText editText = new EditText(this);
baseLayout.addView(editText);

//Button 생성
Button btn_txtMove = new Button(this);

//value 생성
btn_txtMove.setText("클릭하면 텍스트를 옮깁니다");

//생성한 baseLayout에 addView 추가
baseLayout.addView(btn_txtMove);
//TextView 생성 후 레이아웃에 추가
TextView txtView = new TextView(this);
baseLayout.addView(txtView);
//btn_txtMove가 클릭되었을때
btn_txtMove.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
            //editText에서 getText하여
            //txtView에 setText 추가할것
                txtView.setText(editText.getText());
            }
        });