Linux で、スワップ領域(swapfile)を増やす方法

  1. スワップに追加するファイルを作成
    ======================

/swapfile という名前のファイルをサイズ4GBの大きさで、作成(この例ではルート(/)配下にswapfileという名前のスワップファイルが作成される)。

$ dd if=/dev/zero of=/swapfile bs=1024K count=4096
  1. mkswapコマンドを使用して、スワップファイルをフォーマット
    ======================================
$  mkswap /swapfile
続きを読む

Raspberry PI の Python で、Bluetooth を使って出退勤管理したい。

  1. やりたいこと
    =================================
    会社に Raspberry PI を置いて、iPhone の Bluetooth を使って出退勤管理を Google スプレッドシートに自動入力したい。仕様としては、
  • Raspberry PI の Bluetooth デバイスの検知と連動して
  • あらかじめ作成しておいた Google スプレッドシートに
  • 会社に出社したら出社時刻、
  • 退社したら退社時刻を自動入力する。

やりたいのはたったこれだけだが、手入力で管理する手間を考えたら自分の貴重な時間を年間 12〜20時間は削減できるはず!(当社比(笑、1日 3〜5分かかるとして年間 240日出勤と仮定)これは約半日〜1日に相当する。それでは実際に作ってみましょう。

続きを読む

Apache2 で、HTTP/2 を有効にする方法

Apache 2.4.17 より HTTP/2 がサポートされたというのを知って早速このブログをホストしているサーバー(Ubuntu 16.04 LTS)でsudo a2enmod http2 と打ってみたが、ERROR: Module http2 does not exist!とのエラー。ググってみるとどうやら Apache2 をアップグレードしないといけないらしい。

sudo add-apt-repository -y ppa:ondrej/apache2
sudo apt-key update
sudo apt-get update
sudo apt-get --only-upgrade install apache2 -y

以下のメッセージが出たら、Yを選択(※設定は全部消えるので必要ならapache2.confのバックアップを取ること)。

続きを読む

AWS EC2 で、AMI を自動的に作成するシェルスクリプト

#!/bin/sh

export DATE_CURRENT=`date +%Y-%m-%d`
export TIME_CURRENT=`date +%Y%m%d%H%M%S`
export PURGE_AFTER_DAYS=30
export PURGE_AFTER=`date -d +${PURGE_AFTER_DAYS}days -u +%Y-%m-%d`
export BACKUP_TAG='backup'
 
# 1-1 Get the list of instances that you want to get backup バックアップを作成したい EC2 インスタンス一覧を取得する
INSTANCES=`aws ec2 describe-tags --filters "Name=resource-type,Values=instance" "Name=key,Values=${BACKUP_TAG}" | awk '{print $3}'`

for INSTANCE in ${INSTANCES}; do
 
  BACKUP=`aws ec2 describe-tags --filters "Name=resource-type,Values=instance" "Name=resource-id,Values=${INSTANCE}" "Name=key,Values=${BACKUP_TAG}" | awk '{print $5}'`
 
  # 1-2 Check if the instance is marked as backup or not タグを見てバックアップ対象かどうかチェックする
  if [ "${BACKUP}" == "true" ]; then
 
    # 1-3 Create a backup バックアップを作成する
    AMI_ID=`aws ec2 create-image --instance-id ${INSTANCE} --name "${INSTANCE}_${TIME_CURRENT}" --no-reboot`
 
    # 1-4 Create a tag for search for later use. 検索に使うタグを作成する
    aws ec2 create-tags --resources ${AMI_ID} --tags Key=PurgeAllow,Value=true Key=PurgeAfter,Value=$PURGE_AFTER
  fi
done
 
# 2-1 Search backups by tag タグを条件にして削除可能なバックアップを検索する
AMI_PURGE_ALLOWED=`aws ec2 describe-tags --filters "Name=resource-type,Values=image" "Name=key,Values=PurgeAllow" | awk '{print $3}'`
 
for AMI_ID in ${AMI_PURGE_ALLOWED}; do
  PURGE_AFTER_DATE=`aws ec2 describe-tags --filters "Name=resource-type,Values=image" "Name=resource-id,Values=${AMI_ID}" "Name=key,Values=PurgeAfter"  | awk '{print $5}'`
 
  if [ -n ${PURGE_AFTER_DATE} ]; then
    DATE_CURRENT_EPOCH=`date -d ${DATE_CURRENT} +%s`
    PURGE_AFTER_DATE_EPOCH=`date -d ${PURGE_AFTER_DATE} +%s`
 
    if [[ ${PURGE_AFTER_DATE_EPOCH} < ${DATE_CURRENT_EPOCH} ]]; then
      # 2-2 Delete backup if it is marked as backup タグを見て削除対象か判定を行い、対象であればバックアップを削除する
      aws ec2 deregister-image --image-id ${AMI_ID}
       
      SNAPSHOT_ID=`aws ec2 describe-images --image-ids ${AMI_ID} | grep EBS | awk '{print $4}'`
      aws ec2 delete-snapshot --snapshot-id ${SNAPSHOT_ID}
    fi
  fi
done
続きを読む

PHP で、LinkedList を実装する

基本構造

  1. Node クラスと LinkedList クラスの 2つを作成
  2. Node クラス→ $data と $next の 2つのメンバー変数、このうち $data は private で宣言、アクセス用のメソッド function data() を用意
  3. LinkedList クラスは $first メンバー変数のみ
    insert
    =====
  4. リストの最後に追加するノード $last を new Node($data) で新規作成
  5. $this->first が NULL の場合を判定、NULL だったら $this->first に $last を代入(この状態ではノードが1つしかなく、最初のノードが最後のノードと同義だから)
  6. $current を一時的なノードを表す変数としてまずは $this->first を代入してノードの先頭から始め、
  7. $current->next != NULL になるまで while をまわす
  8. while が終わったら、最後は $node->next に $last を代入
  9. $last を return する
    delete
    =====
  10. $this->first と一致した場合、$this->first を NULL にする
  11. $current を一時的なノードを表す変数としてまずは $this->first を代入してノードの先頭から始め、
  12. $current->next != NULL になるまで while をまわす
  13. もし $current->next == $current の場合
    5. $current->next = $current->next->next にして現在の $current をとばす。そのまま return して while を抜ける
  14. $current を次のノード $current->next にして while に戻る($current = $current->next`)
    read
    =====
  15. array() を用意(この場合は $list 変数)
  16. $current を一時的なノードを表す変数としてまずは $this->first を代入して
  17. ノードの先頭から始め、$current != NULL になるまで while をまわす
  18. array_push($list, $current->data());
  19. $current に次のノード $current->next を代入
  20. foreach で $list as $value、print $value する
続きを読む

AWS SQS を使う

Jenkins 側

#!/bin/bash

export TARGET_HOST='{"hostname":"http://example1.com","username":"user1","password":"pass1"} \
                    {"hostname":"http://example2.com","username":"user2","password":"pass2"}'

export SQS_QUEUE_NAME='eaxmple_queue'

for TARGET_HOST in ${TARGET_HOSTS}; do

  export SQS_QUEUE_URL=$(aws sqs get-queue-url --queue-name ${SQS_QUEUE_NAME} --output text)
  export SQS_MSG_BODY=${TARGET_HOST}
  aws sqs send-message --queue-url ${SQS_QUEUE_URL} --message-body ${SQS_MSG_BODY}

done
続きを読む

Ubuntu で、GUI ログイン画面が表示されないときの対処(CUI テキストモードでの起動)

Ubuntu で、設定を間違えて GUI のログイン画面が表示されなくなってしまった、そんなお嘆きのあなた(わたし)におくる対処方法
Ubuntu をリカバリモードで起動、コマンドプロンプトに root で drop する(このとき、root のパスワードを聞かれるからパスワードを忘れた場合はあきらめるしかないのか・・・?)。root で入っても、ディスクはリードオンリーモードなので、書き込み可能にする。

mount -o remount,rw /

その上で、

vi /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash" とか
GRUB_CMDLINE_LINUX_DEFAULT="" あるのを
↓
GRUB_CMDLINE_LINUX_DEFAULT="text"

と編集する。
GRUB の設定を反映させるために以下のコマンドを実行。

続きを読む