멍멍이네 블로그

체감상 해결됐던 플레이 스토어에서 앱 업데이트 버튼이 안 뜨는 오류 고치는 방법에 대해 설명드리겠습니다.

(생략하실 분들은 맨 밑을 봐주세요!)

 

* 주의 : 이 모든 것은 개인적인 추측과 체감상 해결방법에 대한 내용이므로, 100% 확신이 있는 것은 아니며, 다만 비슷한 오류가 있는 분들에게 도움이 되고자 합니다.

 

* 누구 때문에 생길 수 있을까?

개발사(퍼블리셔), 구글(스토어) 등

 

* 어떤 경우에 이러한 문제가 생길 것인가?(오직 작성자의 개인적인 추측으로만 이루어져 있습니다.)

스토어에서 업데이트 버튼이 안 뜰 경우 왜 그럴까 생각해보았습니다.

많은 분들이 플레이 스토어에 등록하는 개발사에 모든 책임을 씌우지만, 아닐 경우도 존재한다는 것이죠.

 

앱에서 업데이트하고, 서버에 업데이트 버전 올려놨는데, 플레이 스토어에서 업로드가 안 됐을 때(검수 시간 등으로 인한 지연) 버전이 일치하지 않을 수 있겠죠.

-> 이런 경우 업데이트 이후 접속하면 됩니다. (지금까지 한두번 빼고는 본 적이 없는 문제죠)

 

혹은 기존에 스토어를 켜놓아서 제대로 인식을 못 했을 수 있죠.

-> 이런 경우 스토어를 완전히 종료한 후 실행하면 됩니다.

 

최근 자주 생기는 문제는, 해당 기기의 스토어에서 앱이 업데이트 됐는지 인식을 못 하더라구요~

-> 구글 플레이 서비스 or Google Play 서비스에서 모든 데이터 삭제 후 구글 플레이를 실행해보세요!

이렇게 하면, 서버 정보를 다시 읽어오는 것인지, 바로 업데이트 버튼이 보이더라구요! 

 

이밖에 해보진 않았지만, 구글 플레이 서비스가 아닌 구글 플레이 스토어의 데이터를 삭제 후 하면 된다고도 합니다.

 

 

* 요약 : 글 작성자의 추천 방법 순서

1. 한번 완전히 종료 후 실행. 백그라운드에서도 완전히 꺼준다.

(대부분 여기서 해결 됨)

2. 해당 앱과 구글 플레이 스토어를 종료한 후 "Google Play 서비스"(기기별로 한글 혹은 영어일 수 있습니다.) 앱의 모든 데이터 삭제를 누른 후 다시 실행.

(여기까지 온 경우 해결 안 된 경우는 못 봤습니다.)

 

이 글이 많은 분들께 도움이 됐으면 좋겠네요.

1. sudo apt update

2. sudo apt full-upgrade

최신 버전으로 라즈베리파이 업데이트.

 

3. sudo reboot

업뎃 후 재부팅

 

4. mkdir -v ~/폴더명
마크 서버 세팅 폴더 생성

 

5. cd 폴더명

 

6. 자바 설치(마크 1.17 버전 이상 설치 시 자바 1.16 버전 이상 필요함)

7. 자바 패스 등록

자바 세팅

 

8. wget 으로 마크 서버 다운

9. nogui로 한번 실행

10. sudo nano eula.txt   실행 후 false -> true 수정

(소프트웨어 사용 동의)

 

11. nogui 없이 실행.

 

12. 마크 포트 25565 (or 설정 바꿨다면, 바꾼 포트) 포트 포워딩

 

 

 

 

자세한 글들은 구글링 후 동영상 참고 바랍니다.

다만 이번 설치 시 몇 가지 개인적으로 수정했던 부분을 말씀드리는데, 안 되면 그 부분들 참고하시길 바랍니다.

 

주의사항 1.

마크 1.17 버전 이상의 서버는 자바 1.16 버전 이상 설치해야 실행 가능합니다.

따라서, 다른 글을 참고하여 진행 시 자바 설치 부분은 많은 글들에 있는 8 버전이나 11 버전이 아닌 16 버전 이상을 설치하시길 바랍니다.

 

주의사항 2.

wget으로 github에서 자바 설치 시 404 not found 에러가 뜨더군요.

깃허브에서 직접 설치하시길 추천드립니다(저는 그렇게 해서 해결했습니다)

 

주의사항 3.

/world/session.lock: already locked (possibly by other Minecraft instance?)

 

session.lock 관련 에러가 뜰 경우. world 폴더에 보면 session.lock 파일이 있는데, 그것만 지우고 다시 실행시켜봅니다.

이미 session.lock이 있다고 에러뜨길래 지우고 다시 서버를 실행했더니 잘 되네요.

비주얼 같은 경우 NuGet 솔루션 패키지 관리에서 다운 받아서 사용했습니다.

(유니티에서 보자면... 에셋 스토어 - 무료 패키지 같은 느낌... 이랄까요!)

https://hungry2s.tistory.com/204?category=526895

 

 

그런데 유니티에서는 어떻게 써야 할지 찾아보았습니다.

유니티는 직접 코딩하거나 라이브러리를 다운 받아서(혹은 만들거나) 사용하고자 했는데, 더 쉬운 자료가 있네요.

굳이 힘들게 할 필요 없으니 이용해볼까 합니다.

 

 

이 엑셀 리드의 메커니즘은.

1. 엑셀 파일을 실행 후 다른 이름으로 저장 - csv(쉼표로 분리)로 저장 시 csv 파일로 저장이 됩니다.

2. csv 파일은 엑셀 파일의 각 열을 쉼표로 분리하여 저장합니다.

3. 저장된 데이터를 split(쉼표)로 잘라서 사용. - 끝 -

 

엑셀의 1행에는 header(머리말)이 들어가도록 돼 있어서, 보기도 쉽네요.

(리더기는 2행 1열부터 읽음)

 

엑셀 리드 코딩은 간단합니다.

구글링 합시다.

 

출처 : https://github.com/tikonen/blog/tree/master/csvreader

(2014년 9월 13일 자 글)

 

using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text.RegularExpressions;

public class CSVReader
{
	static string SPLIT_RE = @",(?=(?:[^""]*""[^""]*"")*(?![^""]*""))";
	static string LINE_SPLIT_RE = @"\r\n|\n\r|\n|\r";
	static char[] TRIM_CHARS = { '\"' };

	public static List<Dictionary<string, object>> Read(string file)
	{
		var list = new List<Dictionary<string, object>>();
		TextAsset data = Resources.Load (file) as TextAsset;

		var lines = Regex.Split (data.text, LINE_SPLIT_RE);

		if(lines.Length <= 1) return list;

		var header = Regex.Split(lines[0], SPLIT_RE);
		for(var i=1; i < lines.Length; i++) {

			var values = Regex.Split(lines[i], SPLIT_RE);
			if(values.Length == 0 ||values[0] == "") continue;

			var entry = new Dictionary<string, object>();
			for(var j=0; j < header.Length && j < values.Length; j++ ) {
				string value = values[j];
				value = value.TrimStart(TRIM_CHARS).TrimEnd(TRIM_CHARS).Replace("\\", "");
				object finalvalue = value;
				int n;
				float f;
				if(int.TryParse(value, out n)) {
					finalvalue = n;
				} else if (float.TryParse(value, out f)) {
					finalvalue = f;
				}
				entry[header[j]] = finalvalue;
			}
			list.Add (entry);
		}
		return list;
	}
}

 

그리고 필요한 곳에서

List<Dictionary<string, object>> 변수명 = CSVReader.Read("파일명(확장자x)");

선언 후 데이터를 사용하면 된다.

for(int i=0; i<data_dialog.Count; i++)
{
	Debug.Log("i : " + i + " [ " + 변수명[i]["damage"].ToString() + " ] " + " [ " + data_dialog[i]["hp"].ToString() + " ] ");
}

(ex) i : 1 [ 1 ]  [ 1 ] 

이런 식으로 출력된다.

 

다만, 필요에 따라 수정이 필요할 듯하다.

* 파일 경로 *

- 기본적으로 Resources.Load를 사용하기 때문에 Resources 폴더에 있는 csv를 사용하는 장점이자 단점이 있다.

서버나 다른 경로에서 읽어오기 위해서 stream으로 변경해서 사용하는 게 더 활용도가 높을 듯.

 

 

 

php -> unity로 배열 값을 보낼 때, json_encode를 이용해서 보낼 시, unity에서 받은 값으로 바로 JsonUtility로 파싱 할 수 없다.

이는 php와 unity에서 json 파싱하는 형태가 다르기 때문이다.

잘못 파싱할 경우 뜨는 에러&문제와 함께 방법을 알아보자.

 

 

JsonUtility.FromJson 할 경우

1. NullReferenceException: Object reference not set to an instance of an object

2. ArgumentException: JSON must represent an object type.

3. 에러는 없고 변수에 값이 안 들어가거나(array type인데 Debug.Log로 Length 찍어보면 0이 나옴)

 

위와 같은 다양한 오류를 볼 수 있다.

 

그러면 다시 한번 파싱을 제대로 했는지 확인해야 한다.(어딘가 잘못 짰으니, 에러가 뜨는 거겠죠)

 

 

1번과 2번 문제의 경우, 파싱 에러 - 앞에 "Items" 값을 추가해야 된다.

_value = "{\"Items\":" + _value + "}";

// retrun value
//          [{"key1":"A","key2":"B"},{"key1":"C","key2":"D"}]

// need type for translate to json
// {"Items":[{"key1":"A","key2":"B"},{"key1":"C","key2":"D"}]}

_value = "{\"Items\":" + _value + "}";

php에서 json_encode로 값을 보낼 경우, 윗 줄과 같이 오는데, unity에서 JsonUtility.FromJson을 사용하기 위해선 밑의 형태로 바꿔줘야 한다.(array type)

꼭 "Items" 값이 들어가야 하며, 그래도 위와 같은 에러가 뜰 경우 Debug로 괄호나 역슬러시, 큰따옴표 등 값이 제대로 들어갔는지 확인! 

 

 

3번 문제의 경우, Serializable 선언을 확인해주자.

FromJson의 type의 class를 Serializable 선언해주자.

using System; // Serializable

[Serializable]
public class KeyClass
{
    public string key1;
    public string key2;
}

 

 

phpmyadmin 에러가 많이 보입니다 ㅜ_ㅜ 

 

라즈베리파이4에서 phpmyadmin을 설치했는데, 설치가 꼬인건지, 설정파일 에러가 많이 보입니다.(설치를 잘못 했나봅니다)

 

이번 에러 역시 기본 설정파일에 오타(?)가 있어서 생기는 문제.

 

오류 해결 후 참고한 블로그 링크를 첨부합니다.

onlyfor-me-blog.tistory.com/275

 

[PHP] phpmyadmin에서 count(): Parameter must be an array or an object that implements Countable 에러 해결

phpmyadmin을 연동해서 즐거운 마음으로 DB를 만들고 테이블을 하나 만들었는데 갑자기 아래로 스크롤이 이동하면서 빨간 배경의 에러 문구들이 나오는 경우가 있다. 그리고 에러 문구는 제목처럼

onlyfor-me-blog.tistory.com

 

해결방법

1. 설정 파일을 연다.

2. 괄호가 잘못 얽혀있는 부분 수정 후 저장.

3. 파일 저장 후 아파치 재시작.

 Create a database named 'phpmyadmin' and setup the phpMyAdmin configuration storage there.

 

라즈비안4에 phpmyadmin 설치 후 로그인 시 에러 발생.

 

 Create 버튼을 눌러 phpmyadmin 설정 db를 추가해주면 된다.

 

 

* 추가 에러 발생

You do not have necessary privileges to create a database named 'phpmyadmin'. You may go to 'Operations' tab of any database to set up the phpMyAdmin configuration storage there.

Create 하이퍼링크 버튼을 클릭했는데, 만약 위와 같은 에러가 뜰 경우, 현재 권한이 없는 상황이기 때문에, 리눅스 관리자 계정으로 로그인 하던지, 현재 계정의 권한을 관리자와 같이 올려주어야 한다.

1. sudo apt install phpmyadmin 

- phpmyadmin 설치 명령어.

 

2. sudo ln -s /usr/share/phpmyadmin /var/www/html

- phpmyadmin과 apache의 경로가 다르기 때문에, phpmyadmin 설치 후 연결해주어야 한다.(ln)

 

 

 

* 주의 *
phpmyadmin 설치 후 실행했는데

The mbstring extension is missing. Please check your PHP configuration.

접속 시 위와 같은 에러가 뜰 경우

 

sudo apt-get install phpmyadmin php-mbstring php-gettext

sudo service apache2 restart

명령어를 통해 설치 및 아파치 재시작을 해주면 해결된다.

vnc로 라즈베리파이에 접근하려고 한다.

그런데 오랜 대기시간이 걸리며, 위와 같은 에러가 뜬다.

 

대부분 time out이 뜰 경우, 외부접근을 못한다는 뜻이다.

 

하지만 나와 같은 경우는 외부접근은 되는데, vnc가 안되는 상황.

 

이 상황 일 경우, 컴이 꺼져있거나, 라즈베리파이에서 접근 허용이 안 날 경우

방화벽이 막은 상황이었다.

 

방화벽을 해제하거나 vnc 포트(내부포트 5900)을 방화벽에서 예외처리를 해주어야 한다.

 

sudo ufw allow 내부포트
ex) sudo ufw allow 5900

초간단 설명

1. NuGet패키지에서 셀레니움 추가.

2. 사용할 웹 브라우저 드라이버를 NuGet에서 추가.

- (필자는 크롬 사용함. 검색 결과가 많음 -> 구글링에 많은 데이터가 돌아다님.)

3. 크롤링 할 페이지에 가서 F12 - DevTools에서 cs를 확인 후 자기가 접근할 데이터의 태그를 확인.

4. 접근할 데이터의 태그를 가지고 데이터 접근 및 키 입력(버튼 클릭, 아이디 혹은 검색어 입력 등)

 

 

 

 

 

 

 

** Visual Studio 2019 버전 기준 설명입니다. **

1. 프로젝트를 실행한 후 NuGet 솔루션을 켭니다.

(도구 탭 - NuGet 패키지 관리자 - 솔루션용 NuGet 패키지 관리)

 

2. NuGet 솔루션 창에서 Excel을 검색하여 현재 패키지에 추가해줍니다.

NuGet 솔루션창.

* 셀레니움 - 웹 드라이버와, 브라우저 드라이버를 설치해준다.

 

3. 셀레니움을 사용하기 위하여 using 선언.

using OpenQA.Selenium;

using Open.Selenium.Chrome;

 

var driverService = ChromeDriverService.CreateDefaultService(); // 크롬 드라이버 서비스를 기본값으로 설정.

var options = new ChromeOptions(); // 크롬 옵션 설정

 

using (IWebDriver driver = new ChromeDriver(driverService, options))  // 생성자가 많음. 정의부분 가서 확인 후 필요한 방식대로 사용하면 됨.
{

    driver.Url = "http://www.naver.com"; // 브라우저 실행. 접근 할 웹페이지의 url 입력. 

    var searchTextBox = driver.FindElement(By.XPath("접근 할 버튼 혹은 검색창의 XPath"));

}

 

* xpath 확인법.

해당 웹페이지로 접속 후 F12를 누른다.

 

 

 

우측에 생기는 DevTool에서 위쪽 Elements 탭 왼쪽으로 두칸에 있는 네모+화살표 모양을 클릭한다.(단축키 컨트롤+쉬프트+C)

버튼을 클릭한 후 Elements창에서 열리는 해당 속성 태그를 우클릭 후 Copy - Copy XPath를 클릭한다.

필요에 따라 XPath 외 다른 방식을 이용해도 된다.

By.XPath 외에도 By.ClassName이나 By.TagName 메소드도 있음.

 

.Click() 이나 .SendKeys나 .Clear() 는 셀레니움 홈페이지(?) 참조.

 

 

 

 

초간단 설명.
1. NuGet 패키지로 Excel 패키지 추가.

2. using Excel = ""; // 엑셀 파일 접근

3. path클래스로 바탕화면 혹은 실행파일 기준 경로 설정 (파일 생성은 파일 스트림 검색)

4. 해당 파일 접근 후 시트 설정

5. 데이터 read or write

 

 

 

 

** Visual Studio 2019 버전 기준 설명입니다. **

1. 프로젝트를 실행한 후 NuGet 솔루션을 켭니다.

(도구 탭 - NuGet 패키지 관리자 - 솔루션용 NuGet 패키지 관리)

 

2. NuGet 솔루션 창에서 Excel을 검색하여 현재 패키지에 추가해줍니다.

NuGet 솔루션. 이미 Excel 을 검색하여 추가한 상태.

 

 

3. Excel을 사용하기 위하여 상단에 using 선언.

using Excel = Microsoft.Office.Interop.Excel;

 

4. Excel 파일 접근 및 사용.

string path = Path.Combine("엑셀 파일 경로", "엑셀 파일명(확장자 포함)");

 

Excel.Application excelApp = new Excel.Application(); // 컴퓨터에 엑셀이 없을 경우 에러.

Excel.Workbook workBook = excelApp.Workbooks.Open(path);

Excel.Worksheet workSheet = workBook.Worksheets.get_Item(1) as Excel.Worksheet; // 엑셀 1번째 워크시트 가져오기

Excel.Range range = workSheet.UsedRange; // 사용 중인 셀 영역을 가져오기

 

string value = (string)(range.Cells[1, 1] as Excel.Range).Value2; // 오픈한 엑셀 파일의 워크시트에서 1행 1열 값을 가져온다.

 

* 반대로 저장도 가능하며, 메모리 해제를 해주지 않으면, 계속 엑셀이 실행 중임.

* 시트는 숫자로 하면 n번째 시트를 인식하며, 문자열을 통해 시트 이름을 찾을 수 있다.

* 경로는 Path클래스가 아닌 직접 string으로 입력해줘도 된다.