ぐーたらIT

シロルのぐーたら休日録

IT技術について勉強メモを書いていくブログです。

CentOS7 端末(ターミナル)をショートカットキーで起動させる(GUI)

シロルです。
本記事はCentOS7で端末をショートカットキーで起動させる手順を説明します。(Fedoraでもほぼ同じです。)

まず、CentOS(GUI)ではデフォルトの設定では端末をショートカットキーで起動させることはできません。なので、ショートカットキーを自身で設定する必要があります。

デスクトップの左上にある[アプリケーション] → [システムツール] → [設定] → [キーボード]の画面までいきます。
[キーボード]の一番下に「+」があるのでそこをクリックします。(下の画像参照)
f:id:sironekosukaru:20180120155500p:plain
名前は何でもいいです。分かりやすいように設定することをおすすめします。
Commandは重要です。Commandのところには「gnome-terminal」と入力しましょう。
入力が完了したら右下の「Edit」をクリックします。
クリックしたら好きなショートカットキーを押下します。(筆者はCTRLとALTとTを押下して設定しました)
最後に追加で設定完了です。

すぐ反映されるので試してみてください。

Android Studio 目覚まし時計を作ってみる Part3

シロルです。
前回の続きで目覚まし時計を作っていきます。
今回はアラームを設定するのにAlarmmanagerを使ってみたいと思います。

 1. まずAlarmmanagerとは(ここで使う分だけの説明です)

  • Alarmmanagerは設定した時間に別のサービスを起動させてくれる機能があります。時間とサービスを指定するだけで後は勝手にやってくれるということですね。
  • 起動するサービスの指定します。いきなりアクティビティを指定して起動させることはできないみたいです。
  • 時間の指定にCalendarを使うことが出来ます。時間の計算をするプログラムを書かなければいけないみたいですが。
  • 起動するときの流れは、AlarmManager起動 → サービス起動(自分で作る。AlarmManagerがサービスでないと指定できなかったため。) → レシーバーで受け取る(専用のjavaファイルを作る) → アクティビティ起動

なんか大変そう…。
とりあえずAlarmManargerの使い方はこんな感じです。

import android.app.AlarmManager;
AlarmManager am;
am = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(),pendingintent);

引数が謎すぎるので説明します。
getSystemServiceでは「アラームの機能を使うよ」と設定しています。AlarmManagerを使う際はこれを必ず書かなければいけないみたいです。
am.setでは一つ目の引数でどのように起動するかを指定しています。
二つ目の引数でClendarを指定します。この指定されたClendarの時刻にAlarmManagerが起動します。
三つ目の引数である時間、あるタイミングで実行されるIntentを指定しています(ここにサービスを作って指定してあげるみたいです)。
2つ目と3つ目の引数は事前に設定して用意しておく必要があります。

とりあえずjavaファイルが2つ必要になったのが分かりました。
Calendarの設定は放置でサービスを作ります。(javaファイルです)

 2. AlarmManagerに設定するPendingIntent

コードです。

Intent intent = new Intent(getApplicationContext(), messageService.class);
Context ct = getApplication();
PendingIntent pendingIntent = PendingIntent.getService(ct, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

Intentの引数のgetApplicationContextはとりあえず指定しておけみたいな感じで指定しました。
第二引数は起動させるサービスを指定しています。(下で作ります)
二行目はコンテキストを取得。
PendingIntentはある時にIntentを起動させるために使います。
PendingIntent.getServiceで第二引数を「0」にしていますが、複数アラームの設定をする場合は各アラームごとにここの数値を変えなければならないみたいです。

 3. MainActivityに追加

前回書いた「設定した時間を表示するメソッド(timeConf)」のしたに追加します。
sironekosukaru.hatenablog.com

public void timerSet(Calendar calendar){
  //実行するサービスを指定
        Intent intent = new Intent(getApplicationContext(), messageService.class);
        Context ct = getApplication();
        PendingIntent pendingIntent = PendingIntent.getService(ct, 0,
                intent, PendingIntent.FLAG_UPDATE_CURRENT);
        // AlarmManager の設定・開始
        AlarmManager am = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
        am.set(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(),pendingIntent);
}

 4. AlarmManagerに設定するサービス

新しくjavaファイルをMainActivityと同じ場所に作ります。
今回は「messageService.java」とします。

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
public class messageService extends Service{
    //これがないとエラーになる(おまじない的な感じ)
    public IBinder onBind(Intent intent)
    {
        return null;
    }

    public void onCreate()
    {
        Thread thread = new Thread(null, task, "sentMessageService");
        thread.start();
    }

    Runnable task = new Runnable()
    {
        public void run() {
            Intent messageBroadcast = new Intent();
            messageBroadcast.setAction("activityAction");
            sendBroadcast(messageBroadcast);
            stopSelf();
        }

    };
}

1つずつ説明します。

public class messageService extends Service{

サービスを作る場合はServiceクラスを継承させたクラスを作成しなければいけません。

public IBinder onBind(Intent intent)
    {
        return null;
    }

これがないとエラーになります。以上。勉強しておきます…

 public void onCreate()
    {
        Thread thread = new Thread(null, task, "sentMessageService");
        thread.start();
    }

スレッドを作ります。"sentMessageService"のところはスレッドの名前なので何でもいいと思います。
thread.start();で下にあるコードの処理を実行します。

 Runnable task = new Runnable()
    {
        public void run() {
            Intent messageBroadcast = new Intent();
            messageBroadcast.setAction("activityAction");
            sendBroadcast(messageBroadcast);
            stopSelf();
        }
    };

スレッドの処理です。
MessageBroadcastという名前のIntentを作成しています。
setActionでメッセージを設定しています。
sendBroadcast();で先ほど設定したメッセージをブロードキャストします。(これを後で作るレシーバーで受け取る)
最後にサービスを止める処理を行う。


疲れました。今回はここまでにします。
次回はレシーバーを作って一応最低限完成になると思います。

CentOS7 Webサーバを立ててみる

シロルです。
今回はCentOSを使ってWebサーバを立ててみたいと思います。

Webサーバを立てるにあたり必要なことは
Apache(httpd)のインストール
・起動
だけです。
これだけでは寂しいのでhtmlファイルも用意してブラウザで表示させてみます。

1. Apache(httpd)のインストール
yumを使ってインストールします。
httpdがインストールされていないことを確認しときます。

# yum list installed | grep httpd

これはインストール済みのパッケージを一覧で表示するコマンドで、パイプ(|)の後ろのgrep httpdで一覧表示するパッケージを絞っています。
確認も済んだところでインストール。

# yum install httpd

適当にyesの「y」を入力します。
インストールされたかを確認します。

# yum list installed | grep httpd

下のようにそれっぽいのが表示されたら成功です。

httpd.x86_64                               2.4.6-67.el7.centos         @media   
httpd-tools.x86_64                         2.4.6-67.el7.centos         @media 

2. サーバを起動させる
インストールが済んだので起動させてみます。
サービスの起動。

# systemctl start httpd.service

systemctlはいろいろなサービスにも使うコマンドなので主なものをあげておきます。
サービスの停止。

# systemctl stop httpd.service

状態を確認するには以下のコマンドを入力します。

# systemctl status httpd.service

次回からCentOSを立ち上げたときに、一緒にwebサーバも起動させる設定は以下のコマンド。(enable)

# systemctl enable httpd

enableを解除。

# systemctl disable httpd

3. ブラウザで確認
起動させたらブラウザで見れるか確認します。
ブラウザを起動させ、URLを入力するところに「localhost」と入れEnterを押します。
f:id:sironekosukaru:20180116234042p:plain

ブラウザでWebサーバを確認
上の画像のようになれば成功です。

4. htmlファイルを表示させる
htmlファイルを表示させるには決まった場所にファイルを置かなければいけません。
デフォルトでは/var/www/htmlに設定されていると思います。
確認方法はvi /etc/httpd/conf/httpd.confを入力し、DocumentRoot と書いてある行を探してください。

今回はデフォルトで設定されている場所を使います。

まず適当にhtmlファイルを作ります。
/var/www/htmlに以下のコマンドを入力します。(touchコマンドでも可)

# vi test.html

(:wqで保存して終了)
中身を適当に書きます。

<h1>LAMP環境つくるぜ!</h1>

準備完了です。ブラウザを起動させ、URLに「localhost/test.html」と入れます。
表示されたら成功です。

5. 他のPCやパソコンで表示させる
ファイアーフォールでhttpを許可しておきます。
同じネットワーク内であればサーバのIPアドレスを入力するだけです。
仮想環境の場合は少し手間なのでやる気があれば更新します。

以上です。

Android Studio 目覚まし時計を作ってみる Part2

シロルです。
前回は適当にパーツを置く作業をやりました。
今回は入力したデータを取得して表示するところまでやっていきます。

では、
※既存のコードを消して貼り付けるとエラーが出ることがあります。付け足す感じで貼り付けることをおすすめします。

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Editable;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

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

        findViewById(R.id.enter).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                timeConf(mhours(), mminutes());
            }
        });
    }
    //時を取得
    private String mhours(){
        EditText Ehour=(EditText)this.findViewById(R.id.hour);
        String hour = Ehour.getText().toString();
        return hour;
    }
    //分を取得
    private String mminutes(){
        EditText Eminute=(EditText)this.findViewById(R.id.minute);
        String minute = Eminute.getText().toString();
        return minute;
    }
    //設定した時刻を表示
    private void timeConf(String h, String m){
        TextView confview=(TextView)this.findViewById(R.id.confview);
        confview.setText("設定した時間は " + h + ":" + m);
    }

では解説していきます。
setContentView(R.layout.activity_main);の下のコードです。

findViewById(R.id.enter).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            timeConf(mhours(), mminutes());
        }
    });

ここではボタンを押したときの処理を書いています。
findViewById(R.id.enter)でxmlファイルのenterというIDが振られたボタンと紐付けしています。
public void onClick()はボタンが押されたときに実行されます。
その下のtimeConf()は自作メソッドで設定した時間を表示します。引数となるメソッドはこの下です。

次に入力されたデータを取得するメソッドです。

    //時を取得
private String mhours(){
    EditText Ehour=(EditText)this.findViewById(R.id.hour);
    String hour = Ehour.getText().toString();
    return hour;
}
    //分を取得
private String mminutes(){
    EditText Eminute=(EditText)this.findViewById(R.id.minute);
    String minute = Eminute.getText().toString();
    return minute;
}

先ほどと同じようにIDと紐付けしています。(EditText)はなくてもいいですがあるとわかりやすいですね。
EditTextオブジェクトを取得してEminuteと名前を付けています。
Eminute.getText();で入力されたデータを取得します。
toString()でString型に変換します。

//設定した時刻を表示
private void timeConf(String h, String m){
    TextView confview=(TextView)this.findViewById(R.id.confview);
    confview.setText("設定した時間は " + h + ":" + m);
}

setTextでTextViewに設定した時刻を表示します。

timeConf(mhours(), mminutes());

先ほどのボタンを押したときに実行される処理です。
引数にメソッドを使っていますが、実際はそれぞれの戻り値を渡しています。

今回はここまでです。
次回はアラームを設定します。

IPv6とは? ネットワークの勉強

シロルです。
ネットワークの勉強をするにあたりIPv6で苦戦したのでまとめておきます。

  1. IPv6とは

IPv4で問題となっていたアドレスの枯渇を解決するためにできたプロトコルです。(MACアドレスが長くなったみたいなやつです)
主な点だけあげておきます。

  • IPv4では32ビットで表現されていたアドレスが128ビットにまで拡張された。
  • ブロードキャストがなくなった
  • IPsecが標準で実装されているためセキュリティが向上
  • DHCPがなくてもアドレスを自動で設定できる
  1. IPv4IPv6のヘッダの違い
IPv4 IPv6
ToS トラフィックスクラス 名称が変わった
なし フローラベル
プロトコルフィールド ネクストヘッダ 名称が変わった。次の拡張ヘッダを指す
TTL ポップリミット 名称が変わった
チェックサム なし
  1. アドレスの種類
  • ユニキャストアドレス

ユニークのユニ。IPv4のネットワーク部に相当するプレフィックスが64ビット、ホスト部に相当するインターフェイスIDが64ビットと区切りが決まっている。
ユニキャストアドレスは以下に分けられる。

グローバルユニキャストアドレス 2000::/3 先頭から3ビットが001で固定。IPv4のグローバルアドレスに相当
ユニークローカルユニキャストアドレス FC00::/7、FD00::/8 IPv4のプライベートアドレスに相当
リンクローカルユニキャストアドレス FE80::/10 同じネットワーク内でのみ有効(ローカルネットワーク)。自動生成される

複数の相手に送るために使うアドレス。(FF00::/8)

  • エニーキャストアドレス

同じアドレスを持つ複数の相手のうち、自分から一番近い相手に送るためのアドレス。
1つのユニキャストアドレスをほかに設定したら自動的にエニーキャストアドレスになるらしい。

自身を指すアドレス。(::1)

  • アドレスがないアドレス

アドレスがないことを表すアドレス。(::)


後々変更するかもしれません。

Android Studio 目覚まし時計を作ってみる Part1

シロルです。
javaの基本的な文法は理解できたので、目覚まし時計を作ってみたいと思います。
流れとしては
アラームを設定 → アラームが鳴る → 別のアクティビティ起動 → 止める
という感じで作ろうと思います。

とりあえず置きましたみたいな感じですがこれでいきます。
f:id:sironekosukaru:20171223205626p:plain

まずはactivity_main.xmlファイルを見ていきたいと思います。

 <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

    <TextClock
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="60sp"
        android:timeZone="Asia/Tokyo"
        android:format24Hour="HH:mm:ss"
        />

    <EditText
        android:id="@+id/hour"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="textPersonName"
        android:hint="時"/>

    <EditText
        android:id="@+id/minute"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="textPersonName"
        android:hint="分"/>

    <TextView
        android:id="@+id/confview"
        android:layout_width="match_parent"
        android:layout_height="39dp"
        android:textSize="24sp" />

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

1つずつ解説していきます。

  1. TextClock
<TextClock
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="60sp"
        android:timeZone="Asia/Tokyo"
        android:format24Hour="HH:mm:ss"
        />

これは現在時刻を表示してくれます。
android:timeZoneでどこの地域の時刻を表示するかを指定しています。
android:format24Hourは24時間で時刻を表示します。
「HH」は時間を2桁
「mm」は分を2桁
「ss」は秒を2桁

  1. EditText
<EditText
        android:id="@+id/hour"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="textPersonName"
        android:hint="時"/>

    <EditText
        android:id="@+id/minute"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="textPersonName"
        android:hint="分"/>

これは入力したデータを受け取る入力フォームみたいなやつです。
ここで重要なのは、
android:id="@+id/minute"
minuteがこのEditTextのIDになります。自分がわかりやすいIDをつけましょう(名前を自分でつけて識別できるようにするイメージ)。後でプログラムを書くのに使います。

  1. TextView
<TextView
        android:id="@+id/conf"
        android:layout_width="match_parent"
        android:layout_height="39dp"
        android:textSize="24sp" />

これは設定した時刻を表示するのに使います。EditText同様分かりやすいIDをつけます。今回はconfです。

  1. Button
<Button
            android:id="@+id/enter"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="enter" />

このボタンを押すことによりアラームを設定します。
android:text="enter"はボタンに文字を表示させます。今回はenterとしていますが、なぜ大文字で表示されている…
IDもenterです。

今回はここまで。
次回はjavaを書いていきます。

JavaでCalendarを使ってみる

javaでCalendarを使ってみたいと思います。
とりあえず、ドン!

import java.util.*;

public class calendar01 {
    public static void main(String args[]) {
        Calendar calendar = Calendar.getInstance();

        int hour = calendar.get(Calendar.HOUR_OF_DAY);
        int minute = calendar.get(Calendar.MINUTE);

        System.out.println(hour + ":" + minute);
    }
}

解説いきます。
まずは、

import java.util.*;
import java.util.Calendar;

どちらか一つインポートします。
上の*のほうの場合はData型を扱うことができます。

次、

Calendar calendar = Calendar.getInstance();

オブジェクトを取得します。
ここで注意すべき点は「new」をつかわないところです。
使わないでなく、使えないです。

int hour = calendar.get(Calendar.HOUR_OF_DAY);
int minute = calendar.get(Calendar.MINUTE);

int型変数に時間を格納します。getメソッドの引数は下記。

Calendar.get()の引数
HOUR_OF_DAY 何時かを取得
MINUTE 何分かを取得
System.out.println(hour + ":" + minute);

表示‼

Time APIのほうがいいらしいけど理由までは…