Yura YuLife

ITエンジニアの覚え書き。

PCがRealSense R200をUSBハブに接続するとPCから認識できない

タイトルの通り。 IntelのRealSense R200をUSBハブやUSB延長ケーブルに接続すると、PCから認識できないことがあります。 これは単純に電力の供給不足が原因です。

RealSenseなどの深度センサでは、赤外線レーザーによってパターンを照射し、赤外線カメラによってそのパターンの歪みを読み取ることで深度を計算しています。 このレーザーの照射に電力が必要なため、ハブなどに接続すると電力不足で正しく起動しないことがあります。

解決策としては以下のような方法が挙げられます。

  • ACアダプタ付きのUSBハブを利用する
  • PCのUSB 3.0ポートに直接接続する
  • USB延長ケーブルを複数直列に接続しない

2016年2月9日 追記

2つのポートから電力を供給できる、Y字のUSBケーブルっていうのがあるんですね。

こんなの。

参考URL

PythonでGoogle Drive API v3を利用して画像のアップロード

PythonGoogle Drive API v3を利用して、 GoogleDriveにフォルダを作成し、ローカルのフォルダ内の画像をアップロードするスクリプトです。

環境

Google Drive APIの有効化と認証情報の取得

プロジェクトの作成

https://console.developers.google.com/start/api?id=drive のページから、新しいプロジェクトを作成するか、既存のプロジェクトを選択して「続行」をクリックします。

f:id:yurayur:20160129154438p:plain

Google Driveが有効化されました、と表示されたら「認証情報に進む」をクリックします

f:id:yurayur:20160129154449p:plain

認証情報の作成

「新しい認証情報」から「OAuth クライアントID」をクリックします

f:id:yurayur:20160129154502p:plain

アプリケーションの種類は「その他」を選択し、適当な名前を入力します

f:id:yurayur:20160129154513p:plain

「作成」をクリックし、次の画面では「OK」をクリックします

f:id:yurayur:20160129154526p:plain

認証情報のダウンロード

作成した認証情報の「JSONをダウンロード」をクリックします

f:id:yurayur:20160129161136p:plain

JSONファイルをダウンロードし、ファイル名をclient_secret.jsonとして保存します

ライブラリのインストール

以下のコマンドを実行します。

$ sudo pip install --upgrade google-api-python-client

スクリプトの作成

以下のスクリプトupload.pyとして保存し、IMG_DIR等の変数の値を設定します。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from __future__ import print_function
import httplib2
import os
import sys

from apiclient import discovery
import oauth2client
from oauth2client import client
from oauth2client import tools
from apiclient.http import MediaFileUpload

import glob

# アップロードする画像の入っているフォルダ
IMG_DIR = '/path/to/image/dir/'

# アップロードするファイルの拡張子
EXTENSION = 'jpg'

# アップロードするファイルのMIMEタイプ
MIME_TYPE = 'image/jpeg'

# Google Driveに作成するフォルダ名
DRIVE_DIR = 'hoge'

# client_secret.jsonの保存先
CLIENT_SECRET_FILE = '/path/to/client_secret.json'

# アップロード先の親フォルダのID
# Google Driveでフォルダを開いた時のURLの末尾がフォルダID
# https://drive.google.com/drive/folders/ここがフォルダID
FOLDER_ID = 'フォルダIDを入力'

# アプリケーション名
APPLICATION_NAME = '先ほど入力した名前'

# Google Driveにファイルの作成と、当該アプリで作成したファイルを取得できる権限(変更不要)
# その他の権限は以下のURLを参照: https://developers.google.com/drive/v3/web/about-auth
SCOPES = 'https://www.googleapis.com/auth/drive.file'


try:
    import argparse
    flags = argparse.ArgumentParser(parents=[tools.argparser]).parse_args()
except ImportError:
    flags = None


class GoogleDriveUploader:
    def __init__(self):
        self.credentials = self.get_credentials()
        self.http = self.credentials.authorize(httplib2.Http())
        self.service = discovery.build('drive', 'v3', http=self.http)

        # /path/to/dir/*.jpg に一致するファイルを探しに行く
        self.file_path = os.path.join(IMG_DIR, '*.' + EXTENSION)
        self.files = glob.glob(self.file_path)
        if not self.files:
            print("No files to upload.")
            sys.exit()

    def get_credentials(self):
        u'''APIのQuickstartのコードのコピペ

        https://developers.google.com/drive/v3/web/quickstart/python
        初回実行時のみブラウザに認証画面が表示され、
        認証すると~/.credentials/に認証情報が保存される
        2回目以降は保存された認証情報を利用してアクセスする
        '''
        home_dir = os.path.expanduser('~')
        credential_dir = os.path.join(home_dir, '.credentials')
        if not os.path.exists(credential_dir):
            os.makedirs(credential_dir)
        credential_path = os.path.join(credential_dir,
                                       'drive-python-quickstart.json')

        store = oauth2client.file.Storage(credential_path)
        credentials = store.get()
        if not credentials or credentials.invalid:
            flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES)
            flow.user_agent = APPLICATION_NAME
            if flags:
                credentials = tools.run_flow(flow, store, flags)
            else:
                # Needed only for compatibility with Python 2.6
                credentials = tools.run(flow, store)
                print('Storing credentials to ' + credential_path)
        return credentials

    def create_folder(self):
        u'''Google Driveにフォルダを作成する'''
        print("Create folder: %s" % (DRIVE_DIR))
        file_metadata = {
            'name': DRIVE_DIR,
            'mimeType': 'application/vnd.google-apps.folder',
            # マイドライブ直下にフォルダを作成する場合は次の行をコメントアウト
            'parents': [FOLDER_ID],
        }
        folder = self.service.files().create(body=file_metadata,
                                             fields='id').execute()
        # 作成されたフォルダのID
        self.sub_folder_id = folder.get('id')

    def upload_file(self, file_name):
        u'''ファイルをアップロードする'''
        media_body = MediaFileUpload(file_name, mimetype=MIME_TYPE, resumable=True)
        body = {
            'name': os.path.split(file_name)[-1],
            'mimeType': MIME_TYPE,
            # マイドライブ直下にファイルをアップロードする場合は次の行をコメントアウト
            'parents': [self.sub_folder_id],
        }
        self.service.files().create(body=body, media_body=media_body).execute()

    def upload_all_images(self):
        u'''フォルダ内のファイルを全てアップロードする'''
        # マイドライブ直下にファイルをアップロードする場合は次の行もコメントアウト
        self.create_folder()
        for file_name in self.files:
            print('upload: ' + file_name)
            self.upload_file(file_name)

if __name__ == '__main__':
    uploader = GoogleDriveUploader()
    uploader.upload_all_images()

スクリプトの実行

$ python upload.py

Storing credentials to ~/.credentials/drive-python-quickstart.json
Create folder: hoge
upload: hoge1.jpg
upload: hoge2.jpg
...

マイドライブ を開いて、フォルダが作成されてとファイルがアップロードされていることが確認できれば成功です。

参考URL

シェルスクリプトで日付が有効かをチェックし、開始・終了日間でループする

シェルスクリプトで、特定の日付間のログのみを抽出する等の処理をする際に、日付でループするコードの例です。

サンプルコード

loop_date.sh

#!/bin/bash

# 有効な日付ではない場合は終了する関数
function check_date() {
    date -d "$1" || exit 1
    return 0
}

# 引数の数をチェック
if [ $# -ne 2 ]; then
    echo "使い方: ./loop_date.sh 開始日[YYYYMMDD] 終了日[YYYYMMDD]"
    exit 1
fi

# 日付が有効かをチェック
check_date $1
check_date $2

# 開始日 < 終了日になっているかをチェック
if [ $1 -gt $2 ]; then
    echo "開始日は終了日よりも前にしてください"
    exit 1
fi

BEGIN=$1
END=$2
CURRENT=$BEGIN

# 開始日〜終了日までループ
while true; do
    # ここに日付毎の処理を書く
    echo "処理: $CURRENT"

    if [ "$CURRENT" = "$END" ]
    then
    break
    fi

    # 日付を1日インクリメント
    CURRENT=$(date -d "$CURRENT 1day" "+%Y%m%d")
done

動作例

$ ./loop_date.sh 20151201 20151205
2015年 12月  1日 火曜日 00:00:00 JST
2015年 12月  5日 土曜日 00:00:00 JST
処理: 20151201
処理: 20151202
処理: 20151203
処理: 20151204
処理: 20151205

$ ./loop_date.sh 20151130 20151201
2015年 11月 30日 月曜日 00:00:00 JST
2015年 12月  1日 火曜日 00:00:00 JST
処理: 20151130
処理: 20151201

$ ./loop_date.sh 20151131 20151205
date: `20151131' は無効な日付です

$ ./loop_date.sh 20151205 20151201
2015年 12月  5日 土曜日 00:00:00 JST
2015年 12月  1日 火曜日 00:00:00 JST
開始日は終了日よりも前にしてください

$ ./loop_date.sh
使い方: ./date_loop.sh 開始日[YYYYMMDD] 終了日[YYYYMMDD]

参考URL

CSSで等幅フォントの指定

ウェブサイトやブログ記事でソースコードなどを掲載する場合の、等幅フォントの設定例です。

はてなブログ<pre class="code"></pre>に適用されるCSSに、日本語にも強いソースコード向けの等幅フォントRicty Diminishedを追加しています。

pre.code {
  font-family: 'Ricty Diminished', 'Monaco', 'Consolas', 'Courier New', Courier, monospace, sans-serif;
}
<pre class="code">
  def main():
      print "ABCDEFGH"
      print "おはよう"
</pre>

参考URL

シェルスクリプトで正規表現マッチ

シェルスクリプトで引数による条件分岐をする際にif文の列挙やcase文を利用する場合は多々あると思いますが、 単純に引数のチェックのみを行いたいときはbash正規表現マッチで調べるのが簡単です。

bashでの正規表現マッチ

例えば、第一引数が正規表現^h.+ge$とマッチしているかを調べる場合には、以下のように記述します。

if [[ "$1" =~ ^h.+ge$ ]]; then

if文内で=~で比較すると正規表現比較になります。 このとき、正規表現はダブルクォートで囲わない点に注意。囲ってしまうと普通の文字列比較になってしまいます。

#!/bin/bash
# 第一引数は start, stop, restartのいずれか

if [ $# -ne 1 ];then
    echo "Usage: $ ./hoge.sh (start|stop|restart)"
elif [[ "$1" =~ ^(start|stop|restart)$ ]]; then
    /path/to/hoge $1
else
    echo "不明な引数です: $1"
    exit 1
fi

参考URL