반응형
파이썬으로 투명 배경의 이미지로 만드는 방법

아래 코드에서 pixel 배열에 R,G,B 값이 들어있으므로 원하는 컬러를 투명하게 처리할 수 있다.

색깔 범위를 +- 5~10정도 주면 좀 더 배경을 잘 제거 할 수 도 있을 것이다. 

from PIL import Image

# 이미지 파일 열기
image = Image.open("image.png")

# 새로운 alpha channel 생성
alpha_data = []
for pixel in image.getdata():
    if pixel[0] == 255 \
        and pixel[1] == 255 \
        and pixel[2] == 255:
        alpha_data.append(0)
    else:  # 그 외의 경우 alpha 값을 255로 설정
        alpha_data.append(255)
alpha_channel = Image.new("L", image.size)
alpha_channel.putdata(alpha_data)

# alpha channel을 이용하여 이미지의 배경을 투명하게 만듦
new_image = image.convert("RGBA")
new_image.putalpha(alpha_channel)

# 이미지 파일 저장
new_image.save("transparent_image.png")

색상 범위를 쉽게 주려면?  아래 코드 참고

# 색상 범위 설정
lower_color = (245, 245, 245)  # 검색할 색상 범위의 최소값
upper_color = (255, 255, 255)  # 검색할 색상 범위의 최대값


    if lower_color <= pixel <= upper_color:
        alpha_data.append(0)
    else:  # 그 외의 경우 alpha 값을 255로 설정
        alpha_data.append(255)

'Python' 카테고리의 다른 글

Drawing Plot, 투명 이미지 datauri 생성  (0) 2023.03.20
set에 set 추가? frozenset  (0) 2021.02.24
Jupyter Notebook 소스 복구  (0) 2020.06.16
Docker python venv 패키지 유지  (0) 2020.06.07
딕셔너리에서 키삭제  (0) 2019.12.07
반응형
포인트 리스트를 가지고 그림을 드로잉하고, 이것을 원하는 크기로 Resize 하고, 투명 이미지 datauri 만들기...
pointlist = '[(10,10)(20,20)(40,50)(60,80)][(10,80)(24,70)(40,60)(60,40)]'

# image 필드에 데이터가 없는 목록만 뽑아서 배치 작업을 수행한다.
def to_datauri(sn):
    sn = sn.strip()
    # 정규표현식으로 포맷 문자열에서 점 정보 추출
    point_regex = r"\(([-+]?\d+),([-+]?\d+)\)"
    strokes = sn.replace('[', '')
    strokes = strokes.split(']')
    strokes = [ s for s in strokes if s!='' ]

    # 그래프 그리기
    plt.figure()
    fig, ax = plt.subplots(figsize=(3, 2))
    ax.set_facecolor('none') # 배경 투명
    fig.patch.set_alpha(0) # 배경 투명
    # 축과 눈금 숨기기
    ax.axis('off')

    # 각 획별로 분리하여 그리기
    for stroke in strokes:
        points = re.findall(point_regex, stroke)
        if len(points)==0:
            continue
        x_list = [int(point[0]) for point in points]
        y_list = [int(point[1]) for point in points]
        ax.plot(x_list, y_list, color='black', lw=2)

    plt.gca().invert_yaxis()  # y축 뒤집기

    # 그래프 저장
    buf = io.BytesIO()
    plt.savefig(buf, format='png', bbox_inches='tight')
    buf_resized = buf

    ## resize 작업
    buf.seek(0)
    img = Image.open(buf)
    img_resized = img.resize((150,100), Image.Resampling.LANCZOS)  
    # img_resized = img.resize((150,100), Image.ANTIALIAS)  
    # sampling=Image.ANTIALIAS deprecated 되었다. 버전에 따라 위 둘 중 하나를 사용.
    buf_resized = io.BytesIO()
    img_resized.save(buf_resized, format=img.format)

    # buf대신 buf_resized를 변환
    buf_resized.seek(0)
    data_uri = 'data:image/png;base64,'+base64.b64encode(buf_resized.read()).decode('utf-8')
    plt.close()
    plt.clf()
    plt.close('all')
    img.close()
    img_resized.close()
    buf.close()
    buf_resized.close()

    return data_uri

이 함수를 사용하여 드로잉 데이터를 넣으면, datauri 텍스트가 출력된다.

시작,끝 따옴표를 제거한 텍스트를 복사해서 브라우저 URL창에 넣으면 드로잉된 투명이미지가 나온다.. (드래그해 보면, 선만 움직이는 것을 확인할 수 있다. 배경투명)

y축을 뒤집은 이유는? 모니터 스크린 좌표계에서 보통 좌상단이 (0,0) 이다.  plot에서는 좌하단이 (0,0)이다. 따라서 스크린 좌표계로 보이게 하려고 하였다. 

datauri가 아니라 파일로 저장하려면 plt.close() 전에  plt.savefig('test.png') 로 저장하면 된다.

 

'Python' 카테고리의 다른 글

투명 배경 이미지 만들기  (0) 2023.03.22
set에 set 추가? frozenset  (0) 2021.02.24
Jupyter Notebook 소스 복구  (0) 2020.06.16
Docker python venv 패키지 유지  (0) 2020.06.07
딕셔너리에서 키삭제  (0) 2019.12.07
반응형
ViewPager가 ViewPager2 로 업데이트되면서 사용하는 방법이 바뀌었다.

상단에 탭 메뉴가 있어서 메뉴 클릭 또는 컨텐트를 좌우 슬라이드하며 다른 페이지로 변경한다.

- TabLayout을 쓰기 위해 Dependency에 별다르게 추가하지 않아도 기본으로 material이 들어가있다. 

'com.google.android.material:material:1.7.0'

- main activity layout에 tab layout 과 viewpager2 를 추가

<?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:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <com.google.android.material.tabs.TabLayout
        android:id="@+id/tablayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
    >

        <com.google.android.material.tabs.TabItem
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Monday" />

        <com.google.android.material.tabs.TabItem
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Tuesday" />

        <com.google.android.material.tabs.TabItem
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Wednesday" />
    </com.google.android.material.tabs.TabLayout>

    <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        />

</LinearLayout>

- 각 탭별로 fragment xml 생성

frag_monday.xml, frag_tuesday.xml, frag_wednesday.xml 약간씩 바꿔서 확인.

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="170dp"
        android:layout_marginTop="349dp"
        android:layout_marginEnd="170dp"
        android:text="Monday"
        android:textSize="20sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

- 각 fragment 클래스 생성. 이것도 이름만 약간씩 다르게..


public class FragMonday extends Fragment {
    private View view ;
    public static FragMonday newInstance() {
        FragMonday fragMonday = new FragMonday();
        return fragMonday;
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.frag_monday, container,  false) ;
        return view ;
    }

}

- Adapter를 만들어야 한다. ViewPagerAdapter class


public class ViewPagerAdapter extends FragmentStateAdapter {
    private final List<Fragment> fragmnets = new ArrayList<Fragment>() ;
    private final List<String> titles = new ArrayList<>() ;

    public ViewPagerAdapter(@NonNull FragmentActivity fragmentActivity) {
        super(fragmentActivity);
    }

    @NonNull
    @Override
    public Fragment createFragment(int position) {
        return fragmnets.get(position) ;
    }

    @Override
    public int getItemCount() {
        return fragmnets.size() ;
    }

    public void addFragment(@NonNull Fragment frag, String title) {
        fragmnets.add(frag) ;
        titles.add(title) ;
    }
    @NonNull
    public String getTitle(int position) {
        return titles.get(position) ;
    }

}

 

- 이제 MainActivity에서 모두 연결시킨다.


public class MainActivity extends AppCompatActivity {

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

        ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(this);
        viewPagerAdapter.addFragment(FragMonday.newInstance(), "Monday");
        viewPagerAdapter.addFragment(FragTuesday.newInstance(), "Tuesday");
        viewPagerAdapter.addFragment(FragWednesday.newInstance(), "Wednesday");

        ViewPager2 viewPager = findViewById(R.id.viewpager);
        viewPager.setAdapter(viewPagerAdapter);

        TabLayout tabLayout = findViewById(R.id.tablayout);
        TabLayoutMediator tm = new TabLayoutMediator(tabLayout, viewPager, (tab, position) -> {
            tab.setText(viewPagerAdapter.getTitle(position)) ;
        }) ;
        tm.attach();
    }
}

끝.

 

'Develop > Android' 카테고리의 다른 글

RecyclerView, Firebase DB, reload  (0) 2023.03.19
[Android] JSON 데이터 송수신  (1) 2023.03.18
반응형
Firebase DB를 사용하여 RecyclerView에 출력하고, 갱신 버튼을 눌러, DB를 reloading하여 출력해 보자.

 

1. dependency 추가

implementation 'androidx.recyclerview:recyclerview:1.3.0'
implementation 'com.github.bumptech.glide:glide:4.10.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.10.0'

2. activity_main.xml에 recyclerview 추가. reload 버튼 추가

<Button
    android:id="@+id/btn_Reload"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="reload"
    />

<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/recyclerview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    />

3. 아이템 디자인 list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <ImageView
            android:id="@+id/iv_profile"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:src="@mipmap/ic_launcher"
            />
        <LinearLayout
            android:layout_marginLeft="15dp"
            android:gravity="center_vertical"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:orientation="vertical"
            >
            <TextView
                android:id="@+id/tv_id"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="hello"/>
            <TextView
                android:id="@+id/tv_pw"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="hello"/>
            <TextView
                android:id="@+id/tv_userName"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="hello"/>
        </LinearLayout>
    </LinearLayout>
</LinearLayout>

4. 아이템 class. User class (getter and setter 는  alt+insert키로 쉽게 자동생성 하세요.. )


public class User {
    private String profile ;
    private String id ;
    private int pw ;
    private String userName ;

5. CustomAdapter class

public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.CustomViewHolder> {
    private ArrayList<User> arrayList ;
    private Context context ;

    public CustomAdapter(ArrayList<User> arrayList, Context context) {
        this.arrayList = arrayList;
        this.context = context;
    }

    @NonNull
    @Override
    public CustomAdapter.CustomViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false) ;
        CustomViewHolder holder = new CustomViewHolder(view) ;
        return holder; // 홀더 리턴
    }

    @Override
    public void onBindViewHolder(@NonNull CustomAdapter.CustomViewHolder holder, int position) {
        Glide.with(holder.itemView)
                .load(arrayList.get(position).getProfile())
                .into(holder.iv_profile) ;
        holder.tv_id.setText(arrayList.get(position).getId());
        holder.tv_pw.setText(String.valueOf(arrayList.get(position).getPw()));
        holder.tv_userName.setText(arrayList.get(position).getUserName());
    }

    @Override
    public int getItemCount() {
        return (arrayList!=null ? arrayList.size(): 0);
    }

    public class CustomViewHolder extends RecyclerView.ViewHolder {
        ImageView iv_profile ;
        TextView tv_id ;
        TextView tv_userName ;
        TextView tv_pw ;

        public CustomViewHolder(@NonNull View itemView) {
            super(itemView);
            iv_profile = itemView.findViewById(R.id.iv_profile) ;
            tv_id = itemView.findViewById(R.id.tv_id) ;
            tv_userName = itemView.findViewById(R.id.tv_userName) ;
            tv_pw = itemView.findViewById(R.id.tv_pw) ;

        }
    }
}

6. Firebase 설정.

Tools - firebase 선택.  (예전엔 수작업으로 한 거를 편리하게 다 해준다..)

우측에 Realtime Database 메뉴를 선택한다.  Get started with Realtime Database 로 가서, 차례로 진행한다.

connect your app to firebase ; 브라우저로 구글 로그인하여 firebase 콘솔로 가서 프로젝트 생성까지 진행됨.

(실시간 DB를 잘 만든다. 필드도  User class에 맞게 다 맞춘다. +를 눌러 User를 만들고 다시 +를 눌러 User_01을 만들고 다시 +를 눌러 profile, id, pw, userName 필드들을 만든다.   처음엔 사용법을 몰라 어렵다. 하위 노드를 위해 미리 +를 연속해서 눌러줘야 된다. 미리 만들고, 엔터치면 하위에 추가가 안되서 삽질.. )

Add the Realtime Database to your app ; dependency 등을 알아서 설정해 준다.

그러나,... 나의 경우는 빌드시 에러가...  찾아보니, 버전 문제가 또 있다... (어쩌라고.. 정말  막막하게 만드는  버전 호환성...)

build.gradle (project) 에서 4.3.10 으로 들어가 있는데 찾아보니 버전을 14로 올리면 해결된다고 해서 해보니 성공하였음.

classpath 'com.google.gms:google-services:4.3.14'

 

7.MainActivity에서 RecyclerView와 Adapter 연결 및 Firebase 연동...

public class MainActivity extends AppCompatActivity {
    private RecyclerView recyclerView ;
    private RecyclerView.Adapter adapter ;
    private RecyclerView.LayoutManager layoutManager ;
    private ArrayList<User> arrayList ;
    private FirebaseDatabase database ;
    private DatabaseReference databaseReference ;
    private ValueEventListener valueEventListener ;


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

        recyclerView = findViewById(R.id.recyclerview) ;
        recyclerView.setHasFixedSize(true);
        layoutManager = new LinearLayoutManager(this) ;
        recyclerView.setLayoutManager(layoutManager);
        arrayList = new ArrayList<User>() ;

        adapter = new CustomAdapter(arrayList, this) ;
        recyclerView.setAdapter(adapter);

        database = FirebaseDatabase.getInstance();
        databaseReference = database.getReference("User") ; // User table

        valueEventListener = new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                Log.e("AAA", "reload data") ;
                // 데이터를 수신.
                arrayList.clear();
                for (DataSnapshot ds : snapshot.getChildren()) {
                    User user = ds.getValue(User.class) ;
                    Log.e("AAA", user.getId()) ;
                    arrayList.add(user) ;
                }
                adapter.notifyDataSetChanged();
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {
                Log.e("AAA", error.toString()) ;
            }
        } ;

        databaseReference.addListenerForSingleValueEvent(valueEventListener);

        findViewById(R.id.btn_Reload).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                databaseReference.addListenerForSingleValueEvent(valueEventListener);
            }
        });

    }
}

- Reload를 어떻게 하나 궁금했는데 찾아보니 위와 같이 하니 되었다. databaseReference에 리스너를 또 등록하면 됨. 그러면 노드들을 다시 가져오고 갱신되었다. 

 

'Develop > Android' 카테고리의 다른 글

ViewPager2, TabLayout  (0) 2023.03.19
[Android] JSON 데이터 송수신  (1) 2023.03.18
반응형

안드로이드 스튜디오에서 okhttp3를 사용하여 JSON 데이터를 비동기 방식으로 전송하고 수신하는 코드는 다음과 같습니다. 

(참고 app: build.gradle의 dependencies에 추가)

implementation 'com.squareup.okhttp3:okhttp:4.9.3'

(manifest에 권한 추가)

<uses-permission android:name="android.permission.INTERNET"/>
import okhttp3.*;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;

public class MainActivity extends AppCompatActivity {

    private OkHttpClient client = new OkHttpClient();
    private MediaType JSON = MediaType.parse("application/json; charset=utf-8");

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

        // JSON 객체 생성
        JSONObject json = new JSONObject();
        try {
            json.put("name", "John Doe");
            json.put("age", 30);
        } catch (JSONException e) {
            e.printStackTrace();
        }

        // RequestBody 생성
        RequestBody body = RequestBody.create(json.toString(), JSON);

        // Request 생성
        Request request = new Request.Builder()
                .url("https://example.com/api")
                .post(body)
                .build();

        // 비동기 방식으로 요청 전송
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                e.printStackTrace();
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if (!response.isSuccessful()) {
                    throw new IOException("Unexpected code " + response);
                }

                // 수신된 JSON 데이터 디버그 로그로 출력
                try {
                    String responseData = response.body().string();
                    JSONObject receivedJson = new JSONObject(responseData);
                    Log.d("Received JSON", receivedJson.toString());
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

 

* 에러 관련

not permitted by network security policy

  • 버전이 올라가면서 기본적으로 http는 거부한다.. 이런 에러를 만날 것이다.
android okhttp not permitted by network security policy
해결방안은... 
manifest, application 태그
android:usesCleartextTraffic="true"

  • 하지만 스토어에 등록은 안될 것이다!!. https에 SSL 인증까지 해야 등록가능..
  • 즉, 테스트 용도에서는 가능.

NetworkOnMainThreadException , StrictMode$AndroidBlockGuardPolicy

  • 메인 쓰레드에서 네트웍을 블로킹방식 ( execute() )으로 하게 되면 만나는 에러...
  • 쓰레드를 만들어 돌리든지, 비동기 방식으로 변경..
new Thread() {
    public void run() {
        try {
            listFile();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }
}.start();

 

'Develop > Android' 카테고리의 다른 글

ViewPager2, TabLayout  (0) 2023.03.19
RecyclerView, Firebase DB, reload  (0) 2023.03.19
반응형

원격 mysql 서버에 있는 DB의 스키마 작성 쿼리만 얻고 싶을 때?

 

mysqldump --no-data -h [서버IP] -P [포트] -u [사용자] -p [DB명]

  • 옵션 대문자 P와 소문자 p를 헛갈리지 않도록 주의!
  • 보통 mysql 디폴트 포트는 3306 이지만 관리자가 변경할 수 도 있다. 
  • --no-data 옵션으로 데이터는 받지 않고, 스키마만 받을 수 있다. (create table 만 나옴)
  • -p 옵션은 password를 프롬프트로 입력받겠다는 의미이다. -p를 생략하면 패스워드 없이 인증하려고 시도하여 인증실패 날 수 있다. 프롬프트로 패스워드를 받지 않고 커맨드에 패스워드를 직접 넣으려면 -p[패스워드]  이렇게 공백없이 붙여쓴다.   -p 옵션뒤에 공백을 넣고 패스워드를 넣으면  프롬프트로 패스워드 넣으라고 나오고, 뒤에 나온 스트링을 DB명으로 인식하여 찾게 된다.

 

mysql 클라이언트 옵션도 동일하다..

  • mysql  -h [서버IP] -P [포트] -u [사용자] -p
  • mysql  -h [서버IP] -P [포트] -u [사용자] -p[패스워드]
  • mysql  -h [서버IP] -P [포트] -u [사용자] -p [DB명]
  • mysql  -h [서버IP] -P [포트] -u [사용자] -p[패스워드] [DB명]

( -h 옵션 생략시 로컬 호스트 , -P 생략시 3306, -p 생략시 암호없음)

 

반응형

AI에게 이미지를 생성하라고 해 본 결과.....

아래 생성한 이미지의 프롬프트는...   

anime girl, long light gold hair, splendid white designer fashion show concept dress, red cosplay headwear, black scarf, body portrait, red eyes, pink ribbons, slight smile, black constellation motif, windy, concept art, mini tornado stickers, black fishnet wear, highly detailed, digital painting, artstation, concept art, sharp focus, illustration, art by WLOP and greg rutkowski and alphonse mucha and artgerm and yanjun chen

 

 

 

아.. 이건 처음으로 프롬프트 아무거나 달과 지구 사진을 달라고 테스트 해 본 거입니다.

 

 

'AI(DeepLearning)' 카테고리의 다른 글

[ChatGPT] 글쓰기  (0) 2023.02.09
[ChatGPT] 글쓰기 테스트  (1) 2023.02.09
XGBoost 요약  (0) 2019.12.06
처음해본 kaggle 도전기  (1) 2019.11.27
Custom EarlyStopping  (0) 2019.11.11
반응형

아래 글은 ChatGPT가 작성하게 해 본 겁니다. 내용이 정확하지 않을 수 있으니, 조심하세요...

요약 : 기본 사항을 이해하고, 적절한 형태를 사용하고, 점차적으로 체중 증가, 부피 증가, 변화, 영양에 중점을두고 휴식을 취함으로써 데 드리프트 체중을 증가시킵니다.

"## 데드 리프트 체중을 신속하게 늘리기 위해 어떻게 운동합니까?

img

데드 리프트는 힘과 힘을 얻기위한 가장 중요한 연습 중 하나입니다. 또한 마스터하기 가장 어려운 운동 중 하나입니다. 모든 운동과 마찬가지로 데드 리프트 체중을 늘리려면 일관성을 높이고 운동을 올바르게 수행해야합니다. 이 기사는 데 드리프트 체중을 신속하게 늘리기 위해 운동하는 방법에 대한 팁을 제공합니다.

기본 사항을 이해하십시오

데드 리프트 체중을 늘리기 시작하기 전에 운동의 기본 사항을 이해하는 것이 중요합니다. 운동의 적절한 형태와 기술뿐만 아니라 데드 리프트에 사용되는 근육을 알아야합니다. 이렇게하면 이익을 극대화하고 부상을 예방하는 데 도움이됩니다.

적절한 형태를 사용하십시오

데드 리프트를 수행 할 때는 적절한 형태를 사용하는 것이 중요합니다. 형태는 일관성이 있어야하며 올바른 근육을 참여시키는 데 집중해야합니다. 올바른 양식을 사용하지 않는 경우 적절한 형태로 최대한 많은 무게를 들어 올릴 수 없습니다.

체중을 점차적으로 증가시킵니다

데드 리프트의 무게를 늘리면 점차적으로 수행하는 것이 중요합니다. 이로 인해 부상을 입을 수 있으므로 체중을 너무 빨리 증가시키지 않아야합니다. 편안한 체중으로 시작하고 더 강해지면서 체중을 점차적으로 증가시킵니다.

볼륨 증가

데드 리프트 체중을 빠르게 늘리려면 운동량을 늘리는 것이 중요합니다. 이것은 운동의 더 많은 세트와 담당자를 수행하는 것을 의미합니다. 운동량을 늘리면 근육과 힘을 키우는 데 도움이됩니다.

변형을 사용하십시오

표준 데 드리프트를 수행하는 것 외에도 일상에 변형을 통합해야합니다. 이것은 운동을 흥미롭고 도전적으로 유지하는 데 도움이 될 수 있습니다. 데드 리프트의 변화는 다른 근육을 목표로하는 데 도움이 될 수 있습니다.

영양에 중점을 둡니다

영양은 힘을 얻고 데 드리프트 체중을 증가시키는 데 중요한 요소입니다. 균형 잡힌 식단을 먹고 충분한 단백질을 섭취하면 근육을 키우고 운동을 지원하는 데 도움이됩니다.

나머지

휴식은 모든 운동 루틴의 중요한 부분입니다. 휴식은 근육이 회복하는 데 도움이되며 부상을 예방하는 데 도움이됩니다. 운동 사이에 충분한 휴식을 취하십시오.

이 팁을 따르면 데드 리프트 체중을 신속하게 늘릴 수 있어야합니다. 적절한 형태를 사용하고 체중을 점차적으로 늘리는 것을 잊지 마십시오. 변형을 사용하여 운동을 흥미롭게 유지하고 영양에 초점을 맞추십시오. 마지막으로 운동 사이에 휴식을 취하십시오."

'AI(DeepLearning)' 카테고리의 다른 글

[SD] 이미지생성  (0) 2023.02.09
[ChatGPT] 글쓰기 테스트  (1) 2023.02.09
XGBoost 요약  (0) 2019.12.06
처음해본 kaggle 도전기  (1) 2019.11.27
Custom EarlyStopping  (0) 2019.11.11
반응형

아래 정보. 생성한 글, 요약한 정보, 해시태그까지 모두 ChatGPT로 한 결과입니다.
꽤 그럴싸한 정보들인데 가끔 틀린 정보들도 있으니 조심해야 됩니다. ㅎㅎㅎ

요약: 낮은 무게, 적절한 형태, 일관된 훈련, 기타 운동, 휴식 및 균형 잡힌식이 요법으로 벤치 프레스 체중을 점차적으로 증가시킵니다.

벤치 프레스 무게를 늘리는 방법

img

벤치 프레스는 심각한 리프터에게 가장 중요한 연습 중 하나입니다. 상체 운동의 필수 부분이며 근육, 힘 및 크기를 만드는 데 도움이 될 수 있습니다. 그러나 벤치 프레스 무게를 늘리는 데 어려움이 있다면 다음과 같은 도움을 줄 수있는 몇 가지 팁이 있습니다.

팁 1 : 양식에 중점을 둡니다

벤치 프레스 체중을 높이기 위해 할 수있는 가장 중요한 일은 적절한 형태에 집중하는 것입니다. 올바른 형태를 갖추면 올바른 근육을 사용하고 리프트를 최대한 활용할 수 있습니다. 등이 평평하고 발이 땅에 단단히 심어지고 팔꿈치가 옆구리에 집어 넣어야합니다.

팁 2 : 그립 강도를 높이십시오

그립 강도는 벤치 프레스 무게를 늘리는 데 필수적입니다. 그립 강도를 향상 시키려면 농부의 산책, 손목 컬 및 바벨 행과 같은 운동을하십시오. 그립 강도를 사용할 수도 있습니다. 그립 강도는 그립 강도를 높이도록 도와줍니다.

팁 3 : 복합 운동을 사용하십시오

복합 운동은 한 번에 여러 근육 그룹을 대상으로하는 운동입니다. 복합 운동은 강도와 ​​힘을 구축하는 데 적합하며 벤치 프레스 무게를 높이는 데 도움이됩니다. 복합 운동의 일부 예로는 스쿼트, 데드 리프트 및 오버 헤드 프레스가 있습니다.

팁 4 : 삼두근을 훈련시킵니다

당신의 삼두근은 누를 때 막대를 밀어 넣는 근육입니다. 벤치 프레스 무게를 늘리려면 삼두근을 훈련시켜야합니다. 이를위한 훌륭한 운동은 근접 그립 벤치 프레스, 딥 및 삼두근 푸시 다운입니다.

팁 5 : 볼륨을 높이십시오

볼륨을 높이는 것은 벤치 프레스 무게를 늘리는 좋은 방법입니다. 볼륨은 주어진 운동에서 수행하는 총 세트 및 담당자 양을 나타냅니다. 벤치 프레스 볼륨을 높이려면 세트 당 더 많은 세트를 수행하거나 세트 당 담당자 수를 늘릴 수 있습니다.

팁 6 : 충분한 단백질을 먹습니다

충분한 단백질을 섭취하는 것은 근육과 힘을 구축하는 데 필수적입니다. 단백질에는 근육의 빌딩 블록 인 아미노산이 들어 있습니다. 벤치 프레스 무게를 늘리려면 매일 충분한 단백질을 섭취하십시오.

팁 7 : 충분한 수면을 취하십시오

마지막으로, 벤치 프레스 무게를 늘리기 위해서는 충분한 수면을 취하는 것이 중요합니다. 잠을 자면 신체는 근육 조직을 수리하고 에너지 저장을 보충합니다. 충분한 수면을 취하려면 밤에 7-9 시간을 목표로하십시오.

이 팁을 따르면 벤치 프레스 무게를 즉시 늘릴 수 있어야합니다. 행운과 행복한 리프팅!

'AI(DeepLearning)' 카테고리의 다른 글

[SD] 이미지생성  (0) 2023.02.09
[ChatGPT] 글쓰기  (0) 2023.02.09
XGBoost 요약  (0) 2019.12.06
처음해본 kaggle 도전기  (1) 2019.11.27
Custom EarlyStopping  (0) 2019.11.11
반응형

tomcat 8 설치. 서비스 등록 스크립트

  • OS 는 데비안
  • openjdk 8 은 검색하면 쉽게 구할 수 있다.
  • openjdk 8 로 tomcat 구동
  • tomcat8 계정을 생성한다. (tomcat8 계정 권한으로 프로세스 구동)

- JDK 설치

cp openlogic-openjdk-8u342-b07-linux-x64.tar.gz /usr/lib/jvm/
cd /usr/lib/jvm
tar xvfz openlogic-openjdk-8u342-b07-linux-x64.tar.gz
mv openlogic-openjdk-8u342-b07-linux-x64 openjdk-8
rm openlogic-openjdk-8u342-b07-linux-x64.tar.gz

JAVA_HOME은 아래와 같다. 
/usr/lib/jvm/openjdk-8

- tomcat 설치

; tomcat 계정 생성
루트 계정으로 아래 작업!
useradd -d /home/tomcat8 -M tomcat8  ; 계정 생성. (홈디렉터리 생성하려면 -M 대신 -m)
(참고) userdel -r tomcat8  ; tomcat8 계정 및 폴더 삭제.

; apache-tomcat-8.5.84.tar.gz 을 설치할 위치로 복사. 
mv apache-tomcat-8.5.84.tar.gz /home
cd /home
tar xvfz apache-tomcat-8.5.84.tar.gz
mv apache-tomcat-8.5.84 tomcat8
; 이름을 간단하게 tomcat8로 변경. 위 tomcat8 계정의 home 디렉터리가 됨.

- 권한 설정
chown -R tomcat8:tomcat8 /home/tomcat8

- 기본적인 설정 작업
$ cd /home/tomcat8/conf
$ vi server.xml

; 예를 들어서 포트 변경을 다음과 같이 할 수 있다.  WAS 포트는 58080, 58443 으로 한다.
<Connector port="58080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="58443" />

AJP 포트는 58009 로 설정한다.
<Connector protocol="AJP/1.3"
               address="0.0.0.0"
               secretRequired="false"
               port="58009"
               redirectPort="58443" />
  • 서비스 구동 스크립트
    (아래 내용을 그대로 붙여 넣으면 파일이 생성됨.)
    (직접 편집하려면 [Unit] 부터 EOF 이전까지 복사해서 붙여넣기 사용)
    경로명을 잘 확인한다.

cat << EOF > /etc/systemd/system/tomcat8.service
[Unit]
Description=Apache Tomcat Service
After=syslog.target network.target

[Service]
Type=forking

Environment="JAVA_HOME=/usr/lib/jvm/openjdk-8"
Environment="CATALINA_HOME=/home/tomcat8"
Environment="CATALINA_BASE=/home/tomcat8"
Environment="CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC"
Environment="JAVA_OPTS=-Djava.security.egd=file:///dev/urandom"

ExecStart=/home/tomcat8/bin/startup.sh
ExecStop=/home/tomcat8/bin/shutdown.sh

User=tomcat8
Group=tomcat8

[Install]
WantedBy=multi-user.target
EOF

  • 서비스 자동 시작 등록 및 구동 테스트

systemctl enable tomcat8
systemctl start tomcat8
systemctl stop tomcat8

+ Recent posts