読者です 読者をやめる 読者になる 読者になる

エンジニアの頭の中

フリーランスエンジニアが書く技術系ブログです。

「UNIXという考え方―その設計思想と哲学」という本を読んだ(要約・書評)

どんな本?

UNIXという考え方―その設計思想と哲学」は、プログラム開発におけるUNIXの思想について述べた本です。

少し古い本ですが、その内容からは、共感できる点や学ぶ点が多いです。その考え方は、現代においても有効な点が多々あると思います。 こちらは、日本語に翻訳されたもので、原著は「The UNIX Philosophy」になります。

この本の要点

この本では、UNIXの考え方として重要な点を、9つの「定理」として語られています。

定理

  1. スモール・イズ・ビューティフル
  2. 一つのプログラムには一つのことをうまくやらせる
  3. できるだけ早く試作を完成する
  4. 効率より移植性
  5. 数値データはASCIIフラットファイルに保存する
  6. ソフトウェアの梃子を有効に活用する
  7. シェルスクリプトを使うことで梃子の効果と移植性を高める
  8. 過度の対話的インタフェースを避ける
  9. すべてのプログラムをフィルタにする

それぞれの定理とされているものについて、要点を以下にまとめてみました。 あくまでも、これらは、著者の主張を断片的に抽出したものです。実際の書籍では、細かい説明や、具体的な実例が豊富に記載されているので、ぜひ書籍を読んでみることをお勧めします。

定理1.スモール・イズ・ビューティフル

プログラムは、本来の目的のみを実現する小さなプログラムであるべきで、関連はするものの、本来の目的とは異なる機能を持った、巨大なプログラムを作るべきではないと述べています。

例として、ファイルをコピーするプログラムを挙げており、コピー元からコピー先へ、ファイルの内容をコピーする処理(目的の処理)の前後に必要になるファイルの存在有無のチェックなどの処理は、他の小さなプログラムに任せるべきということです。UNIXの実例として、ファイルの存在有無にはtestコマンドが使用されている点を挙げています。

小さなプログラムのメリット

  • わかりやすい
  • 保守しやすい
  • システムリソースにやさしい
  • 他のプログラムと組み合わせやすい

定理2.一つのプログラムには一つのことをうまくやらせる

一つのプログラムでは、一つの機能のみを提供すべきです。そのためには、以下の様な点を確認すべきです。

  • ユーザーとの対話が必要か?パラメータをファイルやコマンドラインから渡すだけでは足りないのか?
  • 入力データは、特殊なフォーマットが必要なのか?フォーマット変換は、他のプログラムでできるのではないか?
  • 出力データは、特殊なフォーマットが必要なのか?ASCIIではダメなのか?
  • 似たような機能を持った、他のプログラムを使い回す事が出来ないか?

この「一つのプログラムには一つのことをうまくやらせる」という考えかたから外れてしまったUNIXにおける実例が、lsコマンド であり、純粋なlsコマンドは、ファイルとディレクトリの一覧を順不同の一列で表示するものですが、その後のバージョンのlsは、表示内容を複数列に整えて表示したり、様々な機能を提供するために、大量のオプションがある点を指摘しています。

定理3.できるだけ早く試作を作成する

とにかく、早く試作せよとのこと。 アプリケーションの設計を固めてから、実装にかかるのではなく、コードを書き、早く試作することによって、うまくいく点、うまくいかない点を早く知り、リスクを減らし、結果として製品のリリースは早まるとしています。 具体的なプロセスとして、以下の3点を繰り返します。詳細な仕様書は、以下の繰り返しが終了した後、もし必要であれば作成します。

  1. 短い機能仕様書の作成
  2. コードを書く
  3. テスト

定理4.効率より移植性

プログラムは、効率が良く高速であることよりも、移植性の高さを重視すべきと述べています。また、データにおいても、移植性の高さを重視しています。

効率の良いコードは、ハードウェアの性能を活用して、高速な処理を実現するが、同時にグラフィクスアクセラレータやキャッシュメモリなどを活用するため、移植性が犠牲にされてしまいます。単一のアーキテクチャでしか動かないプログラムでは、利用機会が狭められ、マーケットが限られてしまうというデメリットだと主張しています。また、ハードウェアは、時間と共に進化して高速になっていきます。ハードウェアの性能向上により、現時点で低速だったプログラムは、十分高速に動かせる可能性があります。そのため、わずかな処理時間の短縮のために、コードを書き換えるようなことは時間の無駄です。 そうなった時に、プログラムが新しいハードウェアでも稼働できるよう、移植性が重要になります。

高い移植性 を実現するための、具体的な手段の例として、プログラムをシェルスクリプトで書くことを挙げています。 シェルスクリプトで書いたコードは、C言語で書いたコードより高い移植性を持ちます(OSにもよりますが)。

定理5.数値データはASCIIフラットファイルに保存する

データは、人が読めてかつ簡単にエディタで編集ができるASCIIで保管するべきで、バイナリや特殊なファイルシステムは使用するべきではないと述べています。

ASCIIであれば、多くのUNIXコマンド(awk、diff、grepsed、sort、tail … )でもデータを扱うことができます。 ASCIIであることによって、バイナリと比較して、効率が落ちる可能性は否めないでしょうが、高い効率を求められるプログラム以外では、ほとんど問題とはならないですし、また、マシンの性能の向上によっても、この点は改善されていくでしょう。

データをASCIIテキストで保管してく事は、アプリケーションを移植する際に、そのデータの移植も簡単にします。

定理6.ソフトウェアの梃子を有効に活用する

梃子を有効に活用するために、以下の点について、それぞれの重要性を語っています。

  • コードを書くのではなくコードを借りる
  • 独自記述に陥らないようにする
  • 他人にコードを使わせる
  • 自動化する

「よいプログラマはよいコードを書く。偉大なプログラマはよいコードを借りてくる」と始まり、他人の仕事の成果を自分の仕事に取り入れるべきで、それこそが、効率よくソフトウェアを作成する方法であり、借りられたコードも価値を高めるため、借りる側、借りられた側共にメリットがあると述べています。

車輪の再発明による無駄や、コードの移植性を下げることになりかねないことから、独自技術に進んでいくことに注意を促しています。コードの梃子を有効に活用にするには、他人のコードを借りるだけではなく、自分のコードを他人にも使わせるべきで、UNIXが成功した原因も、コードを自由に使えたことにあると言っています。

また、ソフトウェアの梃子を活用するには、人が作業するのではなく、とにかくマシンを働かせるべき、自動化すべきとしています。

定理7.シェルスクリプトを使うことで梃子の効果と移植性を高める

プログラムの梃子の効果を最大限得るためには、シェルスクリプトを効果的に使用しなければならないと述べています。

シェルスクリプトは、他人の書いたプログラム(シェルスクリプトC言語で書かれたプログラムなども)を、容易に使う事が出来ます。たった1行のスクリプトコードでも、パイプ「 | 」で連結して、複数のコマンドを連携して処理させる事が出来ます。

定理8.過度の対話的インタフェースを避ける

プログラムを起動して、ユーザーと対話しながら処理を行っていくインタラクティブなインタフェースのことを、「拘束的インタフェース」と表現しており、これに対して批判的な考えを示しています。 拘束的インタフェースのデメリットとして、以下の点を挙げています。

  • コンピュータが、人による入力を待っている時間は無駄であり、コンピュータの処理能力を活かしきれていない。
  • コマンドパーサーが大きく醜くなる。(他の定理に反することになる)
  • 対話的インタフェースは、UNIXの長所である「プログラム同士の会話」を行う事が苦手であり、シェルスクリプトに組み込む事が困難になるため、他のプログラムと結合する事が難しく、プログラムの梃子の効果を得る事が出来ない。
  • プログラムを繰り返し実行する事が困難で、スケーラビリティに欠ける。(拘束的インタフェースであるadduserコマンドで数千人のユーザー追加を行う事が現実的でない事を例に挙げている)

定理9.すべてのプログラムをフィルタにする

全てのプログラムは、何かしらの入力を受け付け、処理した結果を出力するフィルタであるとの考えを示しています。 また、データはコンピュータが作るのでなく、人間が作るもので、コンピュータはデータを変換するものだと述べています。

プログラムをフィルタ化するために、設計として、守るべき点は以下のとおりです。

  • データの入力にはstdinを使用する。
  • データの出力にはstdoutを使用する。
  • 帯域外情報の出力にはstderrを使用する。

プログラムをフィルタとして作成することを意識しておけば、拘束的インタフェースを避ける事ができ、梃子の効果をえる事ができます。

感想

「定理1.スモール・イズ・ビューティフル」の思想は、UNIXに限らず、現代のソフトウェア開発においても、大いに役に立つ考え方だと思っています。特に、保守のしやすさや、他のプログラムと組み合わせやすいという点は、重要な点だと思っています。

基本的にプロダクトの一部となるコードは、将来に渡ってメンテナンスしていくものです。最初にコードを書いた本人が、将来もそのコードのメンテナンスをし続けていくとは限りません。現在のためだけでなく、将来の担当者のメンテナンスのしやすさのためにも、小さなプログラムの作成を心がけるのは良いと思います。

「定理6.ソフトウェアの梃子を有効に活用する」では、「コードを借りるべき」という主張があります。効率や作り込むリスクを考えれば、当たり前のことではあるのですが、公開されているオープンソースのライブラリや、使用しているフレームワーク、プロジェクト内で作成済みのライブラリなどで、すでに提供されている機能を、「コードを借りる」事をせず、自前で作成してしまうというケースをよく見かけます。(逆によく理解せずに無闇に他人コードを借りて問題が起きるケースもありますが・・・)

「コードを借りる」事の実現のしやすさのためにも、「小さなプログラム」である事は重要です。コードを借りることができず、類似のコードを書く羽目になると、開発工数の増加や、不具合リスクの増加、保守性の低下など、良くないことばかりですが、ソフトウェア開発の現場では、頻繁に起きている問題だと思っています。

その他の「定理」としているものについても、大体は納得のいくもので、現実の多くのシーンにおいて通じるものではないかと思います。

ちなみに、定理については6章までで語られていて、その後の 「第7章 さらなる10のUNIXの考え方」では、実際のUNIX人が、どのようなシーンでどのように考え行動しているかを、著者の経験から紹介しているのですが、この章もなかなか面白いです。

総評すると、知識を深めるという点でも、面白さという点でも、とても充実した本だと思います。 ページ数は多くないですが、内容は濃く、値段も安いと思います。

日頃、UNIXに触れるかどうかに関わらず、エンジニアの人には、ぜひ読んでもらいたい一冊です。

書籍情報

表紙

※原著はKindle版が販売されていますが、翻訳版は紙の本しか販売されていないようです。

目次

  • 第1章 UNIXの考え方:たくさんの登場人物たち
  • 第2章 人類にとての小さな一歩
  • 第3章 楽しみと実益をかねた早めの試作
  • 第4章 移植性の優先順位
  • 第5章 これこそ梃子の効果!
  • 第6章 対話的プログラムの危険性
  • 第7章 さらなる10のUNIXの考え方
  • 第8章 一つのことをうまくやろう
  • 第9章 UNIXとその他のオペレーティングシステムの考え方

SeleniumとPythonを使用してネットプリントへの書類登録を自動化

http://www.printing.ne.jp/support/common_v5/src/jpn/images/nps-logo.png

あらすじ

仕事の取引先とは、見積書や請求書などの書類を、郵送でやりとりしなくてはならないのですが、印刷するためのプリンタを持っていないため(たまにしか印刷しないので所有したくない)、紙の書類を印刷する必要がある時は、ネットプリントというウェブサービスを使用しています。

www.printing.ne.jp

ネットプリントは、ウェブ上で登録した文書をセブンイレブンのプリンタで印刷できるサービスです。

月に数枚程度しか印刷しないので、これで十分なのですが、毎月使用していると、ブラウザから印刷するためのファイルを登録する作業さえも面倒に感じるようになり、自動化しようと思いました。

自動化のイメージとしては、印刷したいファイルのファイルパスを自動化プログラムに渡して起動すれば、あとはプログラムがネットプリントにファイルを登録してくれるというものです。

外部から印刷用ファイルを登録するための、APIが公開されていれば、手っ取り早いのですが、調べてみた結果、APIは公開されていませんでした。 そのため、普段手作業で行なっていたブラウザの操作を、Seleniumを使って自動化するためのコードを書きました。

使用した Python のバージョンは、3.5.1 です。(別に3系である必要はありません)

前準備

Seleniumをインストール

Seleniumを使用して、ウェブブラウザを操作するため、pipを使用してPythonSeleniumライブラリをインストールします。

$ pip install selenium

$ pip show selenium
---
Metadata-Version: 2.0
Name: selenium
Version: 3.3.3
Summary: Python bindings for Selenium
Home-page: https://github.com/SeleniumHQ/selenium/
Author: UNKNOWN
Author-email: UNKNOWN
Installer: pip
License: Apache 2.0
Location: /Users/mi2/.pyenv/versions/3.5.1/lib/python3.5/site-packages
Requires:
Classifiers:
  Development Status :: 5 - Production/Stable
  Intended Audience :: Developers
  License :: OSI Approved :: Apache Software License
  Operating System :: POSIX
  Operating System :: Microsoft :: Windows
  Operating System :: MacOS :: MacOS X
  Topic :: Software Development :: Testing
  Topic :: Software Development :: Libraries
  Programming Language :: Python
  Programming Language :: Python :: 2.6
  Programming Language :: Python :: 2.7
  Programming Language :: Python :: 3.3
  Programming Language :: Python :: 3.4
  Programming Language :: Python :: 3.5
  Programming Language :: Python :: 3.6

Chrome Driverをインストール

今回は、ウェブブラウザは、Google Chrome を使用します。 Seleniumで、Chromeを操作するために、Chromeのwebdriverが必要になります。 Homebrew でインストールします。

$ brew install chromedriver

$ chromedriver --version
ChromeDriver 2.29.461585 (0be2cd95f834e9ee7c46bcc7cf405b483f5ae83b)

実装

Seleniumを使用して、Google Chrome の操作を自動化するためのコードを、Pythonで書きます。

upload_to_netprint.py

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

import sys
import time

from selenium import webdriver


def upload(username, password, file):
    driver = webdriver.Chrome(executable_path="/usr/local/bin/chromedriver")
    try:
        driver.implicitly_wait = 3  # ページロード待ち時間(秒)
        driver.delete_all_cookies()  # Cookieを削除

        # ログイン画面取得
        print("[Step 1] Get login display.")
        driver.get("https://www.printing.ne.jp/usr/web/NPCM0010.seam")
        driver.find_element_by_id("NPCM0010:userIdOrMailads-txt").send_keys(username)
        driver.find_element_by_id("NPCM0010:password-pwd").send_keys(password)

        # ログイン実行
        print("[Step 2] Login.")
        driver.find_element_by_id("login").click()

        # create-document
        print("[Step 3] Open create-document display.")
        driver.find_element_by_xpath('//*[@id="NPFL0010"]/section[1]/div[1]/a').click()

        # プリントの設定
        print("[Step 4] Input printing preferences.")
        driver.find_element_by_xpath('//*[@id="NPFL0020"]/table/div/tbody/tr[3]/td[2]/div[1]/label[1]/span[2]').click() # 用紙サイズはA4を指定
        driver.find_element_by_xpath('//*[@id="NPFL0020"]/table/div/tbody/tr[5]/td[2]/div[2]/label[3]').click() # カラーモードは白黒を指定
        driver.find_element_by_xpath('//*[@id="NPFL0020"]/table/div/tbody/tr[6]/td[2]/div/label[2]/span[2]').click() # 予約番号タイプは「数字のみ」を指定
        driver.find_element_by_xpath('//*[@id="checkBox3"]/div[1]/label[2]/span[2]').click() # 登録結果通知は「設定する」を指定
        driver.find_element_by_xpath('//*[@id="upload-document"]').send_keys(file) # アップロード対象ファイルを選択
        driver.find_element_by_xpath('//*[@id="update-btn"]/span[2]/span').click() # アップロード実行

        time.sleep(2)

    finally:
        driver.close()


if __name__ == "__main__":
    if len(sys.argv) != 4:
        print("Usage: $user $pass $file")
        exit(1)
    upload(username=sys.argv[1], password=sys.argv[2], file=sys.argv[3])
    exit(0)

webdriverの初期化時にchromedriverのパスを指定する

executable_pathにchromedriverのパスを指定しています。

driver = webdriver.Chrome(executable_path="/usr/local/bin/chromedriver")

予めchromedriverにパスが通っている場合は、driver = webdriver.Chrome()と、引数無しで書いても問題ありません。

操作対象の要素の指定

画面の要素は、XPathで指定しています。

driver.find_element_by_xpath('//*[@id="NPFL0020"]/table/div/tbody/tr[3]/td[2]/div[1]/label[1]/span[2]').click() # 用紙サイズはA4を指定

印刷設定を変更したい場合は、コードも書き換える必要があります。(最終的には、印刷設定をコードと切り離して指定できるようにしたい) 画面の要素のXPathを調べて、書き換えてください。XPathの簡単な取得方法は、以下の記事でも紹介しています。

mi2.hatenablog.com

実行

ネットプリントにログインするため、ネットプリントのアカウントを持っている必要があります。 実行時に、引数でネットプリントのアカウントの認証情報と、登録対象のファイルのパスを渡します。

upload_to_netprint.py $username $password $filepath

引数の内容は、以下の通りです。

driver.find_element_by_xpath('//*[@id="checkBox3"]/div[1]/label[2]/span[2]').click()で、登録結果を通知するよう指定しているため、プログラムが正常終了した後は、登録結果がメールで通知されます。

セブンイレブンへ行って、専用の端末にこのメールに記載された番号を入力してプリントする事ができます。

まとめ

このプログラムによって、ネットプリントにファイルを登録するために、ブラウザを操作は自動化できましたが、プログラムの実行の際に、ファイルパスを渡してプログラムを実行するのは、若干面倒です。 次は、このプログラムを実行するためのトリガーを仕掛けて、自動起動を実現したいと思います。

ChromeでXPathを簡単に取得する

スクレイピングするためのコードを書く場合など、XPathを取得したい場合があるかと思います。

Google Chromeを使用して、ウェブページのXPathを簡単に取得する方法について、記載します。

そもそもXPathとは

XPath(XML Path Language)とは、XML文書の木構造内のノードの位置を指し示すためのパスのことです。XPathについては、わかりやすく説明している記事がたくさんあるので、そちらをご覧ください。

www.atmarkit.co.jp

XPath 取得方法

  1. Google Chrome で、目的のページへアクセスします。
  2. XPathを取得したい要素にマウスカーソルを合わせて右クリックします。
  3. 表示されたメニューから、「Inspect」を選択します。

    例:GIZMODOというタイトル部分のXPathを取得する場合

    f:id:mitsu3204:20170415161432p:plain

  4. Developer Toolが起動し、該当の要素のHTMLソースにフォーカスした状態となるので、右クリックして、Copy -> Copy XPath を選択します。
    f:id:mitsu3204:20170415161455p:plain
  5. これで、クリップボードにコピーされています。あとは、使用箇所にペーストして使いましょう。以下のような、XPathが出力されます。
    //*[@id="app"]/div/div/header/div/h1/a/svg/g/path

 

 

【2017年版】Bloggerのカスタムドメインにお名前.comで取得したドメインを設定する

https://2.bp.blogspot.com/-DoeR_SHpjSk/Vo9HKuimy2I/AAAAAAAAAFE/ROsHesQeeXU/s1600-r/eblogger.png

 

Bloggerのブログに、お名前.comで管理しているドメインをカスタムドメインとして設定する方法を紹介します。

 

必要なのは、以下の二つの設定を行うだけです。

  1. BloggerサードパーティURLにカスタムドメインを設定

  2. お名前.comのドメインNaviでCNAMEを設定

 

1.BloggerサードパーティURLにカスタムドメインを設定

  1. Bloggerにログインします。
  2. 画面左側のメニューから、「設定」の下に表示されている「基本」をクリックして設定画面を開きます。
    f:id:mitsu3204:20170411000210p:plain
  3. 「ブログのサードパーティURLを設定」をクリックします。

    f:id:mitsu3204:20170411000508p:plain

  4. 「http://」の後ろに使用したいドメインを入力して「保存」をクリックします。

    例えば、自分の購入したドメインが「example.com」で、ブログ用のサブドメインとして「blog」を使用したい場合は、「blog.example.com」と入力します。
    ※ここで付与した「blog」という名前は、後でお名前.comの設定にも使用します。
    f:id:mitsu3204:20170411000803p:plain

2. お名前.comのドメインNaviでCNAMEを設定

  1. お名前.comのドメインNaviにログインします。
  2. ドメイン設定タブを開き、「ネームサーバーの設定」から、「DNS関連機能の設

     

    定」をクリックします。

    f:id:mitsu3204:20170410234656p:plain

  3. 対象のドメイン名の横のラジオボタンをチェックして、「次へ進む」をクリックします。

    f:id:mitsu3204:20170410235043p:plain

  4.  「DNSレコードを設定する」をクリックします。

    f:id:mitsu3204:20170410235200p:plain

  5.  以下のとおり入力したら、「追加」をクリックして、CNAMEのレコードを追加します。


    ホスト名:blog(Blogger側で指定した名前に応じて変更してください)
    TYPE:CNAME
    VALUE:ghs.google.com

    f:id:mitsu3204:20170410235523p:plain
  6. 画面下部の「確認画面へ進む」をクリックします。
  7. 表示された内容を確認して、入力に間違いがなければ、「設定する」をクリックします。

 

以上で完了です。

 

DNSの変更が反映されるまで、時間がかかる場合があります。少し時間をおいてから、blog.example.comにアクセスしてみましょう。(example.comの部分は自分のドメインに置き換えてください。)

Bloggerの自分のブログ画面が表示されれば成功です。

 

マテリアルデザインのアイコンをAndroidアプリに簡単に使用する方法

最近のAndroidアプリといったら、マテリアルデザインが主流です。

知っている人も多いと思いますが、マテリアルデザインのアイコンは、Googleが公開しているサイトからゲットして、自分のAndroidアプリに簡単に取り込むことができます。

その手順を説明します。 

 

アイコンは、以下のサイトから取得することができます。

material.io

このサイトでは、たくさんのマテリアルデザインのアイコンを公開していて、Androidアプリに限らず、iOS用、ウェブサイト用のアイコンを入手することも可能です。

アイコン入手手順

まず、ブラウザで上記のサイトへアクセスします。

f:id:mitsu3204:20170408190633p:plain

画面をスクロールしていくと、以下のように入手可能なアイコンの一覧を確認できます。

f:id:mitsu3204:20170408190614p:plain

使用したいアイコンの名前がわかっているのであれば、「Search」と表示されているテキストフィールドに、テキストを入力して、表示されるアイコンを絞り込むことができます。名前がわからないのであれば、普通にスクロールして、目的のアイコンを探しましょう。

 

アイコンが見つかったら、そのアイコンをクリックします。クリックすると画面下部に青いバーが表示されます。

f:id:mitsu3204:20170408191022p:plain

 

アイコンのdpを選択します。アイコンの使用箇所によって、24dpや48dpなど適切なものを選択してください。

アイコンの色も黒か白かを選択可能です。(例では48dpで黒を選択します)

選択したら、PNGSをクリックすると、指定したアイコンのpng画像をダウンロードできます。

f:id:mitsu3204:20170408191347p:plain

例の画像の通りに入力すると、ic_settings_black_48dp.zip というファイルがダウンロードできます。

イコン画像zipファイルの構成

zipファイルを展開すると、以下の構成になっています。androidios、webと3つのディレクトリがありますが、今回使用するのは、androidディレクトリです。

$ tree ic_settings_black_48dp
ic_settings_black_48dp
├── android
│   ├── drawable-hdpi
│   │   └── ic_settings_black_48dp.png
│   ├── drawable-mdpi
│   │   └── ic_settings_black_48dp.png
│   ├── drawable-xhdpi
│   │   └── ic_settings_black_48dp.png
│   ├── drawable-xxhdpi
│   │   └── ic_settings_black_48dp.png
│   └── drawable-xxxhdpi
│       └── ic_settings_black_48dp.png
├── ios
│   └── ic_settings_48pt.imageset
│       ├── Contents.json
│       ├── ic_settings_48pt.png
│       ├── ic_settings_48pt_2x.png
│       └── ic_settings_48pt_3x.png
└── web
    ├── ic_settings_black_48dp_1x.png
    └── ic_settings_black_48dp_2x.png

9 directories, 11 files

androidディレクトリの配下を見ると、mdpiからxxxhdpiに至るまで、各dpのアイコンが揃っています。

アイコンをそれぞれ作るのは面倒な作業なので、これは助かります。 

Androidアプリへの適用方法

ic_settings_black_48dp/androidディレクトリの中にある、以下のディレクトリをまとめてリソースディレクトリへコピーするだけです。

以下を全てコピーして

  • drawable-hdpi
  • drawable-mdpi
  • drawable-xhdpi
  • drawable-xxhdpi
  • drawable-xxxhdpi

アプリのリソース用ディレクトリ(app/src/main/res/)の配下へペーストしましょう。

これだけで完了です。 

読書、勉強、仕事などにオススメ!六本木ライブラリー アカデミーヒルズを紹介

六本木ライブラリー アカデミーヒルズとは?

http://www.academyhills.com/library/roppongi/tqe2it00000kfa6h-img/tqe2it00000kfaej.jpg

簡単にいうと、図書館とカフェとワークスペースが一つになったような、会員制の施設です。

何ができるかというと、読書、昼寝、お喋り、勉強、仕事などと人によってやっていることは様々です。

ここ数年、私はこの施設を頻繁に利用しているのですが、設備やアクセスの良さ、料金の安さなど、オススメできるポイントが多い場所なので、紹介しようと思います。

特にノマドワーカーや、勉強や読書に集中したい人などには、特にオススメです。

 

六本木ライブラリー アカデミーヒルズの特徴

施設の特徴について記載していきます。

本について📖

http://www.academyhills.com/library/roppongi/tqe2it00000kfa6h-img/tqe2it00000kfafx.jpg

通常の図書館と比べてしまうと、本の量は多くないのですが、旬な本があったり、変わった本があったりします。

本を検索するための端末があるので、目的の本の配置場所を調べることも可能です。

高いところにある本は、手が届かず自分では取れません。。。

図書館のような、本の貸し出しは行っていません。施設内で読むか、もしくは購入することはできます。会員の場合、割引価格で本を購入することが可能です。

無線LAN、電源のあるカフェ ☕️

http://www.academyhills.com/library/roppongi/tqe2it00000kfa6h-img/tqe2it00000kfaf8.jpg

カフェスペースがあります。ここでは、飲食や会話、電話もOKです。
打ち合わせ風な会話をしている人、読書している人、昼寝している人など、たくさんの人がいます。
カフェでは、コーヒー以外にも、ジュースや軽食も販売しています。また、飲み物、食べ物の持ち込みも可能です。

Google マップで、施設内部が公開されているので、気になる人は見てみてください。

Google マップ

六本木ヒルズ49Fからの景色が良い!👫

六本木ヒルズの49階にあるため、景色がとても綺麗です。
カフェからは、東京タワー、スカイツリー、レインボーブリッジ、東京湾などを見ることができます。

また、ワークスペースからは、まだ別の方角を見ることができます。昼も夜もそれぞれ違った景色が見れるところも良いです。

ワークスペース(自習室)がたくさんある✏️

http://www.academyhills.com/library/roppongi/tqe2it00000kfa6h-img/tqe2it00000kfagm.jpg

自習室としての部屋が複数あります。自習室は、食べ物の持ち込みが禁止ですが、飲み物は持ち込みOKです。窓側の席に座れば綺麗な景色も見えます。

部屋によっては、PCなどの電子機器が持ち込みNGの部屋もあるので、タイピングの音すらもシャットアウトしたい場合にはオススメです。

基本的に自習室内は静かなので、集中するには最高の環境であり、私がアカデミーヒルズをオススメする一番の理由です。

 

こちらも、施設内部が見たければ、以下のGoogleマップリンクから見てみてください。

Google マップ

設備も充実🖨

無線LAN、電源、延長コード、コピー機、携帯電話の充電機などがあります。喫煙室もあります。

無線LANは二種類あり、一つは暗号化無しのオープンな回線で、もう一つは、暗号化されたセキュアな回線となっています。パスワードは半年に一度変更されるため、ある日突然接続できなくなります。パスワードが変わったら、フロントの人に教えてもらいに行く必要があります。

ちなみに、無線LANの速度ですが、基本的には、十分な速度が出ていると思いますが、利用状況と場所によっては、かなり遅くなる場合があります。kbpsのレベルまで落ちる場合もあり、この点はストレスを感じる場合があります。

頻繁にイベントがある✨

施設内では、様々な種類の講演や、会員のコミュニティによるイベントを頻繁にやっています。

会員同士で集まって開催しているイベントには、本好きの集まる会や、旅行研究会、英語で討論する会など様々なものがあります。こういったイベントを通して、趣味嗜好の合う人とも知り合うことができるかもしれませんね。

以下からイベント予定を見ることができます。(2017年4月のイベント予定)

イベント予定 2017年 アカデミーヒルズ

六本木なのでアクセスは良い🚗

六本木ヒルズ内にある施設なので、最寄駅は六本木駅となります。
大江戸線六本木駅からだと、多少歩きますが、日比谷線六本木駅からなら直結です。

料金は月会費が9000円💰

会員制となっており、会員種別によって、料金と利用できる施設の内容などが異なっています。

コミュニティメンバー

アカデミーヒルズの会員のうち、ほとんどの人は、こちらの会員種別だと思います。私もコミュニティメンバーとして利用しています。

コミュニティメンバーの会費は、月9,000円(税別)です。また、初回事務手数料は5,000円です。個人的な感覚としては、利用している内容から考えると、月9,000円は安い!と感じています。

www.academyhills.com

オフィスメンバー

こちらは、利用可能な施設の内容や利用可能な時間など、サービスの内容がコミュニティメンバーとは異なるようです。オフィスメンバーでないと、進入することができないエリアがあります。

料金も月会費90,000円、入会金300,000円とお高くなっております。

朝は早くから、夜は遅くまで営業している🏢

朝7:00 - 夜24:00(最終入館23:00)と、朝早くから夜遅くまでやっていてとってもありがたいです。(オフィスメンバーなら24時間365日利用できるようですが)

確か年末年始くらいは、営業時間が短くなりますが、それ以外はほぼ上記のとおりだったと思います。

 

以上になります。

 

集中して勉強、作業、読書などをするための環境を探している人には、とても良い場所だと思います。

ぜひ利用を検討してみてください。

www.academyhills.com

macOS Sierra に64bit版のsqlplus 12.1 をインストールしてOracleへ接続する

やること

macOS sierra に、64bit版のsqlplus 12.1 をインストールして、Oracle DBへ接続するためのクライアント環境を作成します。 sqlplusは、Oracleのサイトから無償で入手可能です。

環境情報

端末は以下の通り。

項目 内容
端末 MacBook (Retina, 12-inch, Early 2016)
OS macOS sierra Version 10.12

sqlplusインストール手順

Oracle Instanct Client をダウンロードする

  1. ウェブブラウザで、以下のOracleのウェブサイトを開きます。

    Instant Client downloads for Mac OS X (Intel x86)

  2. 64bit版の以下の4つのファイルをダウンロードします。

    • instantclient-basic-macos.x64-12.1.0.2.0.zip
    • instantclient-jdbc-macos.x64-12.1.0.2.0.zip
    • instantclient-sqlplus-macos.x64-12.1.0.2.0.zip
    • instantclient-sdk-macos.x64-12.1.0.2.0.zip

    f:id:mitsu3204:20170401164746p:plain

Instant Client を展開する

  1. sqlplusを配置するためのディレクトリを作成します。 ここでは、ホームディレクトリの直下にsqlplusというディレクトリを作成します。好みに合わせて変更してください。

     mkdir ~/sqlplus
    
  2. ダウンロードしたInstinct Client の各zipファイルを、先ほど作成したsqlplusディレクトリ内へ、展開します。

     $ mkdir ~/sqlplus
     $ unzip Downloads/instantclient-basic-macos.x64-12.1.0.2.0.zip -d ./sqlplus/
     $ unzip Downloads/instantclient-jdbc-macos.x64-12.1.0.2.0.zip -d ./sqlplus/
     $ unzip Downloads/instantclient-sqlplus-macos.x64-12.1.0.2.0.zip -d ./sqlplus/
     $ unzip Downloads/instantclient-sdk-macos.x64-12.1.0.2.0.zip -d ./sqlplus/
    

sqlplusを使用するための環境変数を設定する

  1. ~/.bashrcに以下の記述を追加します。

     export ORACLE_HOME=~/sqlplus/instantclient_12_1
     export PATH=$ORACLE_HOME:$PATH
     export DYLD_LIBRARY_PATH=~/sqlplus/instantclient_12_1
    
  2. .bashrcを更新したら、環境変数を有効にしましょう。

     . ~/.bashrc
    

sqlplusを起動する

  1. 最後に、sqlplusが起動するか確認してみましょう。ターミナルでsqlplusコマンドを実行します。

     $ sqlplus
    
     SQL*Plus: Release 12.1.0.2.0 Production on Sat Apr 1 16:33:12 2017
    
     Copyright (c) 1982, 2016, Oracle.  All rights reserved.
    
     Enter user-name:
    

sqlplusが起動できれば、完了です。

sqlplusからOracleへの接続方法

sqlplusに認証情報をつけてダイレクトにDBに接続することもできますが、historyに認証情報を記録させないように、/nolog(ノーログイン)をつけて起動しています。 sqlplus起動後は、conn ユーザー/パスワード@接続先ホスト:ポート番号/データベース名でDBへ接続します。

$ sqlplus /nolog

SQL*Plus: Release 12.1.0.2.0 Production on Sat Apr 1 16:52:59 2017

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

SQL> conn <user>/<password>@host:port/dbname

以上