[CentOS7] yum php7 설치

OS 2024. 4. 10. 14:36


CentOS 7에 yum을 이용해 php를 설치하면 5.4.x 버전이 설치가 된다
PHP 7.x 버전을 설치하는 방법은 아래와 같다.

1. 기존버전 삭제

  [root@localhost ~]# yum remove php-*

2. EPEL 설치

  EPEL(Extra Packages for Enterprise Linux): 최신버전 패키지를 제공하는 저장소

  [root@localhost ~]# yum install epel-release # 최신버전 패키지 저장소
  [root@localhost ~]#  yum install yum-utils     # yum-config-manager 명령어 사용 가능, yum 저장소 관리를 위해 설치

  [root@localhost ~]# yum -y install http://rpms.remirepo.net/enterprise/remi-release-7.rpm


3. 원하는 버전 php 활성화

  [root@localhost ~]# yum-config-manager --enable remi-php74

 

  yum-confog-manager는 yum-utils 를 설치할 때 함께 설치되는 프로그램 중 하나이다

  PHP 7.1 이나 7.2를 설치하고 싶을 경우, remi-php70 대신 remi-php71 or remi-php72를 활성화한다


4. PHP 7설치 필수 모듈을 설치

  [root@localhost ~]# yum -y install php

  [root@localhost ~]# yum install php php-mcrypt php-cli php-gd php-curl php-mysql php-ldap php-zip php-fileinfo

 

5. 기타 php 서비스 설치
  yum -y install php-fpm
  yum -y install  php-cli  php-redis  php-brotli php-intl php-gd php-gmp php-imap php-bcmath php-interbase php-json php-mbstring php-mysqlnd php-odbc php-opcache php-memcached php-tidy php-pdo php-pdo-dblib php-pear php-pgsql php-process php-pecl-apcu php-pecl-geoip php-pecl-imagick php-pecl-hrtime php-pecl-json php-pecl-memcache php-pecl-mongodb php-pecl-rar php-pecl-pq php-pecl-redis4 php-pecl-yaml php-pecl-zip


6. 설치 확인

  [root@localhost ~]# php-v

 

 

 

Posted by 꼬장e
,

참고 : https://velog.io/@plashdof/%EC%95%8C%EB%9E%8C%EA%B6%8C%ED%95%9C-%EB%B6%84%EA%B8%B0%EC%B2%98%EB%A6%AC-Android-13-Android-12

 

targetSdkVersion 33

 

manifest 파일

 

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/>
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO"/>

 

<uses-permission android:name="com.google.android.gms.permission.AD_ID"/> // 광고

 

private val requiredPermissionList = if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU){
    arrayOf(  // 안드로이드 13 이상 필요한 권한들
        Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.WRITE_EXTERNAL_STORAGE,
        Manifest.permission.READ_MEDIA_IMAGES,
        Manifest.permission.READ_MEDIA_VIDEO,
        Manifest.permission.POST_NOTIFICATIONS
    )
}else if ( Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
    arrayOf(  // 안드로이드 13 미만 마시멜로우 이상 필요한 권한들
        Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.WRITE_EXTERNAL_STORAGE
    )
}

 

 

// 권한 체크 이후로직
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grandResults) {
        // READ_PHONE_STATE의 권한 체크 결과를 불러온다
        if (requestCode == 1001) {
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
                boolean check_result = true;
                // 모든 퍼미션을 허용했는지 체크
                for (int result : grandResults) {
                    if (result != PackageManager.PERMISSION_GRANTED) {
                        check_result = false;
                        break;
                    }
                }

                // 권한 체크에 동의를 하지 않으면 안드로이드 종료
                if (check_result == true) {
                } else {
                    finish();
                }
            }
        }
    }

Posted by 꼬장e
,

build.gradle 파일에 아래의 옵션을 추가한다.

android {
    lintOptions {
        checkReleaseBuilds false
        // Or, if you prefer, you can continue to check for errors in release builds,
        // but continue the build even when errors are found:
        abortOnError false
    }

Posted by 꼬장e
,

관리자 권한 CMD 에서 

dism.exe /online /cleanup-image /restorehealth 명령어 시도

Posted by 꼬장e
,

출처 : https://snowdeer.github.io/android/2017/03/26/notification-listener-service-sample ( snowdeer's Code Holic )

 

안드로이드 노티피케이션(Notification)의 정보를 가져오는 코드를 작성해보도록 하겠습니다. 안드로이드에서 NotificationListenerService라는 서비스 형태의 컴포넌트를 제공하고 있습니다. API 버전 18부터 사용가능하며, 원할하게 쓰려면 API 버전 19 이상을 추천합니다.

안드로이드 SDK에 기본으로 탑재되어 있기 때문에 gradle 등에 별도로 추가할 필요는 없고, manifest.xml에 다음과 같이 서비스를 등록해주면 됩니다.

 

AndroidManifest.xml

<application
  android:allowBackup="true"
  android:icon="@mipmap/ic_launcher"
  android:label="@string/app_name"
  android:supportsRtl="true"
  android:theme="@style/AppTheme">
  ...
  <service
    android:name=".SnowNotificationListenerService"
    android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">
    <intent-filter>
      <action android:name="android.service.notification.NotificationListenerService"/>
    </intent-filter>
  </service>
</application>

 

그리고, Java 코드는 다음과 같습니다.

SnowNotificationListenerService.java

import android.app.Notification;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.service.notification.NotificationListenerService;
import android.service.notification.StatusBarNotification;
import android.util.Log;

public class SnowNotificationListenerService extends NotificationListenerService {

  @Override
  public void onCreate() {
    super.onCreate();
    Log.i("NotificationListener", "[snowdeer] onCreate()");
  }

  @Override
  public int onStartCommand(Intent intent, int flags, int startId) {
    Log.i("NotificationListener", "[snowdeer] onStartCommand()");
    return super.onStartCommand(intent, flags, startId);
  }

  @Override
  public void onDestroy() {
    super.onDestroy();
    Log.i("NotificationListener", "[snowdeer] onDestroy()");
  }

  @Override
  public void onNotificationPosted(StatusBarNotification sbn) {
    Log.i("NotificationListener", "[snowdeer] onNotificationPosted() - " + sbn.toString());
    Log.i("NotificationListener", "[snowdeer] PackageName:" + sbn.getPackageName());
    Log.i("NotificationListener", "[snowdeer] PostTime:" + sbn.getPostTime());

    Notification notificatin = sbn.getNotification();
    Bundle extras = notificatin.extras;
    String title = extras.getString(Notification.EXTRA_TITLE);
    int smallIconRes = extras.getInt(Notification.EXTRA_SMALL_ICON);
    Bitmap largeIcon = ((Bitmap) extras.getParcelable(Notification.EXTRA_LARGE_ICON));
    CharSequence text = extras.getCharSequence(Notification.EXTRA_TEXT);
    CharSequence subText = extras.getCharSequence(Notification.EXTRA_SUB_TEXT);

    Log.i("NotificationListener", "[snowdeer] Title:" + title);
    Log.i("NotificationListener", "[snowdeer] Text:" + text);
    Log.i("NotificationListener", "[snowdeer] Sub Text:" + subText);
  }

  @Override
  public void onNotificationRemoved(StatusBarNotification sbn) {
    Log.i("NotificationListener", "[snowdeer] onNotificationRemoved() - " + sbn.toString());
  }

}

 

참고로 이 서비스는 별도로 startService를 해주지 않아도, 사용자의 권한만 주어지면 자동으로 시작되기 때문에 startService를 구현할 필요는 없습니다.

사용자의 권한을 요청하는 코드는 다음과 같습니다.

Intent intent = new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS");
startActivity(intent);

 

하지만, 위 코드를 매번 호출하는 것은 사용자에게 상당히 번거로운 일이기 때문에, 다음과 같은 코드를 이용해서 기존에 사용자가 해당 App에 권한을 부여한 적이 있는지 확인하는 것이 좋습니다.

 

MainActivity.java

import android.content.Intent;
import android.support.v4.app.NotificationManagerCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import java.util.Set;

public class MainActivity extends AppCompatActivity {

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

    boolean isPermissionAllowed = isNotiPermissionAllowed();

    if(!isPermissionAllowed) {
      Intent intent = new Intent("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS");
      startActivity(intent);
    }
  }

  private boolean isNotiPermissionAllowed() {
    Set<String> notiListenerSet = NotificationManagerCompat.getEnabledListenerPackages(this);
    String myPackageName = getPackageName();

    for(String packageName : notiListenerSet) {
      if(packageName == null) {
        continue;
      }
      if(packageName.equals(myPackageName)) {
        return true;
      }
    }

    return false;
  }
}
Posted by 꼬장e
,

출처 : http://it-archives.com/222114870620/  (흑곰의 유익한 블로그 2호점)

아이폰(iOS) 하이브리드 앱에서는 <input type=”file”> 을 사용하면 해당 요소를 클릭 시 파일선택 창(FileChooser)이 잘 뜨지만, 안드로이드 웹뷰에서는 <input type=”file”> 요소를 클릭해도 아무 반응이 없다.

안드로이드 하이브리드앱에서 파일을 선택하는 기능은 아래와 같이 구현 가능하다.

1. mFilePathCallback 변수를 전역변수로 선언한다.

webView 를 사용할 Activity 클래스(또는 Activity 를 상속받은 클래스) 에 선언하면 된다.

    // 안드로이드 웹뷰에서 파일 첨부하기
    ValueCallback mFilePathCallback = null;

2. WebChromeClient 클래스의 onShowFileChooser 메서드를 오버라이딩해서 아래와 같이 작성한다.

파일 n개 선택(파일 여러개 선택, 파일 다중선택) 하려면 intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); 코드를 포함시키자.

    webView.setWebChromeClient(new WebChromeClient() {
        // 안드로이드 웹뷰에서 파일 첨부하기
        @Override
        public boolean onShowFileChooser(WebView webView, ValueCallback filePathCallback, FileChooserParams fileChooserParams) {
            mFilePathCallback = filePathCallback;

            Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
            intent.addCategory(Intent.CATEGORY_OPENABLE);
            intent.setType(“image/*”);

            // 파일 n개 선택 가능하도록 처리
            intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);

            startActivityForResult(intent, 0);
            return true;
        }
    });

만약 WebChromeClient 를 상속받아 별개의 자바파일로 구현했다면(ex : public class OOOWebChromeClient extends WebChromeClient {}), startActivityForResult 메서드를 곧바로 사용할 수 없을 것이다.

이 경우 WebChromeClient 생성자에서 activity 를 받아 thisActivity 라는 멤버변수에 저장해놓으면 thisActivity.startActivityForResult(intent, 0); 식으로 사용할 수 있다.

public class OOOWebChromeClient extends WebChromeClient {
    private final Activity thisActivity;

    public OOOWebChromeClient(Activity thisActivity) {
        super();
        this.thisActivity = thisActivity;
    }

    (중략)

}   

3. mFilePathCallback 변수가 선언된 클래스, 다시 말해서 Activify 클래스(또는 Activity를 상속한 클래스) 하단에 아래와 같이 작성한다.

참고로 파일을 n개 선택(여러개 선택, 다중선택)한 경우 data.getClipData() 값이 not null이며, 파일을 1개 선택한 경우 data.getData() 값이 not null이다.

    // 안드로이드 웹뷰에서 파일 첨부하기
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        Log.e(“resultCode:: “, String.valueOf(resultCode));
        if (requestCode == 0 && resultCode == Activity.RESULT_OK) {

            // 파일 n개 선택한 경우
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN && data != null && data.getClipData() != null && data.getClipData().getItemCount() > 0) {
                int count = data.getClipData().getItemCount();

                Uri[] uriArr = new Uri[count];
                for (int i=0; i<count; i++) {
                    uriArr[i] = data.getClipData().getItemAt(i).getUri();
                }

                mFilePathCallback.onReceiveValue(uriArr);

            } else if (data != null && data.getData() != null) {
                // 파일 1개 선택한 경우
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                    mFilePathCallback.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(resultCode, data));
                } else {
                    mFilePathCallback.onReceiveValue(new Uri[]{data.getData()});
                }
            }

            mFilePathCallback = null;

        } else {
            mFilePathCallback.onReceiveValue(null);
        }
    }

만약 WebChromeClient 를 상속받아 별개의 자바파일로 구현했다면(ex : public class OOOWebChromeClient extends WebChromeClient {}), mFilePathCallback 변수를 사용할 수 없을 것이다. OOOWebChromeClien 클래스 내에 mFilePathCallback 의 getter, setter 메서드를 만들어서 접근하도록 하자.

Posted by 꼬장e
,

제어판 > 방화벽 > 고급 > 인바운드규칙 

원격 데스크톱 - 사용자모드 (TCP-In) 선택

영역탭 에서 원격아이피주소에 추가

192.168.0/24 : 로컬영역 모두 허용

'OS' 카테고리의 다른 글

[CentOS7] yum php7 설치  (0) 2024.04.10
[윈도우] 자동업데이트 실패시  (0) 2023.09.24
[Centos] Open JDK 11 설치하기  (0) 2023.02.06
[Centos] Red5 서버 설치  (0) 2023.02.03
[윈도우11] 시스템 트레이 아이콘을 표시  (0) 2023.01.16
Posted by 꼬장e
,

Cfile file;

USHORT nShort = 0xfeff; //유니코드 바이트 오더마크

 

file.Open("c:\\test.text", CFile::modeCreate | CFile::modeWrite | CFile::typeBinary)

 

file.Write(&nShort,2); // 이걸 넣어줘야 인식함

file.Write( _T("문자열") , 문자열길이 * sizeof(TCHAR) );

file.Close();

 

'MFC' 카테고리의 다른 글

파일 입출력  (0) 2020.08.02
MFC 간편하게 환경파일 읽고 쓰기  (0) 2020.02.28
Posted by 꼬장e
,

● 현재 설치된 버전 확인

  # java -version

    openjdk version "1.8.0_362"
    OpenJDK Runtime Environment (build 1.8.0_362-b08)
    OpenJDK 64-Bit Server VM (build 25.362-b08, mixed mode)

혹은 

  # rpm -qa | grep java

    tzdata-java-2022g-1.el7.noarch
    java-1.8.0-openjdk-headless-1.8.0.362.b08-1.el7_9.x86_64
    java-1.8.0-openjdk-devel-1.8.0.362.b08-1.el7_9.x86_64
    python-javapackages-3.4.1-11.el7.noarch
    java-1.8.0-openjdk-1.8.0.362.b08-1.el7_9.x86_64
    javapackages-tools-3.4.1-11.el7.noarch

 

● 이전 버전 삭제 하려면

  # yum remove java-1.8.0-openjdk-1.8.0.362.b08-1.el7_9.x86_64

  # yum remove java-1.8.0-openjdk-headless-1.8.0.362.b08-1.el7_9.x86_64

 

● 설치 가능한 SDK 확인

  # yum list java*jdk-devel

    Loaded plugins: fastestmirror
    Loading mirror speeds from cached hostfile
     * base: mirror.kakao.com
     * epel: ftp.iij.ad.jp
     * extras: mirror.kakao.com
     * rpmfusion-free-updates: mirrors.ustc.edu.cn
     * updates: mirror.kakao.com
    Installed Packages
    java-1.8.0-openjdk-devel.x86_64 1:1.8.0.362.b08-1.el7_9     @updates
    Available Packages
    java-1.6.0-openjdk-devel.x86_64 1:1.6.0.41-1.13.13.1.el7_3  base
    java-1.7.0-openjdk-devel.x86_64 1:1.7.0.261-2.6.22.2.el7_8  base
    java-1.8.0-openjdk-devel.i686   1:1.8.0.362.b08-1.el7_9     updates
    java-11-openjdk-devel.i686      1:11.0.18.0.10-1.el7_9      updates
    java-11-openjdk-devel.x86_64    1:11.0.18.0.10-1.el7_9      updates

 

● 설치

# yum -y install java-11-openjdk-devel.x86_64

 

● 확인 및 설정 ( 링크 설치 이후 참고 )

https://ggojange.tistory.com/150

 

 

Posted by 꼬장e
,

[Centos] Red5 서버 설치

OS 2023. 2. 3. 18:15

자바설치 ( https://ggojange.tistory.com/150 )

 

https://github.com/Red5/red5-server/releases/

다운로드후 서버에 업로드

 

vi /etc/profile 수정

export RED5_HOME=/usr/local/red5-server 추가

source /etc/profile

 

sh $RED5_HOME/red5.sh 실행

Posted by 꼬장e
,