いーほろよいの技術ブログ

IT技術ブログになります。

GCPで最初に押させておくこと

はじめに

GCPについて色々調べていて開発をする前に押さえていた方がいい事があったのでメモしておきます。

 

課金まわり

前回の記事で無料トライアルについて触れたと思いますが、無料トライアルはクレジットを使い切るか1年を過ぎると終了になります。

しかし、いきなり課金される事は無く無料トライアルが終了すると"アップグレード"ボタンがコンソールページの上部に表示されるので、そこを押さない限り課金は発生しないそうです。

また、ちょっとしたテストなどでプロジェクトを作成して不要になったらシャットダウンすればプロジェクトに含まれるリソースは全て削除され、それ以降は課金されなくなります。

因みにシャットダウン後30日間ならプロジェクトを復旧させることが可能です。(2018/01/14現在)

 

プロジェクト作成について

構築(開発)を始めるにあたり、最初に必ずプロジェクトを作ることになります。

プロジェクトはプロジェクト名は重複可能の様ですがプロジェクトIDは一意である必要があります。

プロジェクト作成で1番注意しなくてはいけない事はプロジェクト名、プロジェクトIDは一度決めたら変更出来ません。

そのため企業で利用する場合は命名規則を予め決めておく必要があると思います。

 

大したボリュームではありませんが大事なことなのでしっかりと覚えておきたいと思います。

 

最後までお読みいただきありがとうございます。

Google Cloud Platformを始める!

はじめに

2018年はAI、クラウドの年になるらしいですね。

クラウドに関してはAWSのECインスタンスいじった程度で、これと言えるものが無いので頑張ってAWSGoogle Cloud Platform(以降からGCP)、Azureのどれかを使いこなせるようになろうと思いGCPを選択しました。

理由はGoogleなら様々なAPIと連携して幅広いサービスを構築できる可能性が大きいと感じたためです。

また、いまなら1年間に$300分の無料お試し期間があります。(2018/01/13現在)

 

利用開始するにあたり必要なもの

  • クレジットカード
  • やる気

 

やる事

Googleのアカウントを持っている方なら直ぐに始められます。

入り口をメモしていなかったのですが、検索すれば直ぐに見つかると思います。

そこからGCPの利用を申し込むのですが利用規約はよく読んで於いてください。

※確かお試し期間が終わっても自動で引き落とし状態にはならないとお知らせが出た記憶があります。

そこでクレジットカードの番号を指示に従って入力します。

 

利用開始

手順1

一番はじめにプロジェクト作成を要求されるはずです。(こちらキャプチャー忘れました。)

GCPはプロジェクト単位で管理するようです。

プロジェクト作成は結構時間が掛かった記憶があります。(数分待ちました)

作成されるとプロジェクトIDが発行されます。

まだプロジェクトIDを頻繁に使用する段階では無いので実感が無いのですが、すごい大切なIDなので保管には注意しましょう。

 

手順2

ドキュメントを読んでいると、頻繁にgcloudコマンドが紹介されており、はじめにインストールしておく事を勧められるのでインストールしておきましょう。

私の環境はMax OS Xなので下記にドキュメントを共有します。

Mac OS X 用のクイックスタート  |  Cloud SDK のドキュメント  |  Google Cloud Platform

因みに初期化作業があります。

 

手順3

実感するために手始めにVMインスタンスを作成して見たいと思います。

左上のハンバーガーメニューからCompute Engine > VMインスタンスへと進みます。

画面が表示されたら作成を選択します。

 

手順4

作成を選択すると"インスタンスの作成"画面が表示されます。

因みにここでインスタンス作成時にローカルからssh接続したい場合は公開鍵を登録する事が出来るので用意しておきましょう。

ただし、GCP的にはセキュリティの管理など考慮して推奨していないようなのです。(自己責任で)

要求されるのは下記の項目です。

※CPU、メモリ、ストレージ、OSなどはお好みで!

  • インスタンスの名前
  • ゾーン
  • マシンタイプ
  • ブートディスク
  • SSH接続鍵(必要に応じて)

HTTP、HTTPSの設定もあるのですが今回は割愛します。

選択中は右に1ヶ月あたりの料金が表示されるので便利です。

 

手順5

接続して見ましょう。

接続方法は大きく分けて3つあるようです。

GCPはgcloudを勧めているようです。

ブラウザコンソールを使用したところ重くてストレスを感じます。

SSHクライアントは認証鍵の作成とGCPへの登録及び保守があるのでgcloudが1番扱い易いかも知れません。

どうしてもgcloudが使用出来ない条件があるのならしょうがないかと思いますが...

gcloudを使用したSSH接続

>gcloud compute ssh [EXTERNAL_INSTANCE_NAME]

初回はsshの認証キーが無いと警告が出力されて認証キーを作成します。(パスーワドを聞かれる)

WARNING: The public SSH key file for gcloud does not exist.

WARNING: The private SSH key file for gcloud does not exist.

WARNING: You do not have an SSH key for gcloud.

WARNING: SSH keygen will be executed to generate a key.

認証キーが作成されたら接続を試みる時にまたパスワードを聞かれます。

パスーワードが正しければ接続できます。

以上がVMインスタンスの作成とSSH接続になります。

 

その他

SSHクライアント接続の場合

インスタンス作成前に公開鍵を作成して作成時に入力フォームから登録する。

キーの作成時に気を付けるのは-Cオプションはログイン時のユーザー名になるのでコメントを設定出来ません。

 

まとめ

今回は色々とキャプチャーを取って紹介したかったのですが、表示出来ない情報が含まれており編集が大変なので文字だけにさせていただきました。

 

参考URL

以上、最後までお読みいただきありがとうございます。

 

Redmineをインストールする

はじめに

Redmineを使用するかも知れないので予習でインストールして見ました。

所感はインストール自体は全く問題ございませんでした。

インストール後に画面を開いたらガントチャートとカレンダー機能がデフォルトであって『おぉ〜』となりました。

だいぶ古い時代のRedmineはインストールした事があり、その時は後で自分でプラグインからインストールする必要があった記憶があります...便利になったな〜

ややこしいのですが、Redmineの公式ページにあるインストールページから手順が細かく記載されているページへ遷移できます。

 

 公式ページのインストールページ

インストール — Redmine.JP

 

CentOS7へのインストールページ

blog.redmine.jp

 

環境

CentOS7

Ruby2.4.1

Redmine3.4

httpd2.4

PostgreSQL9.2

※gemインストールについてはインストールページに詳細が書かれているので省略します。

 

手順

手順といってもRedmine Blogにあるインストール手順に沿ってインストールするだけです。

私の場合、1点だけ手順と異なるところはホームに作ったrbenv環境以下にredmineをインストールしただけです。

理由はrubyのバージョンを切り替えて動作確認できるようにしたかったからです。

それ以外は手順と異なるところはありません。

あとは、rbenv以下に作成しているのでgem installする時にrbenv exec gem install と打つくらいです。 

注意点 

Apacheを起動しようとしたら下記のようなエラーが出ました。

 5 of /etc/httpd/conf.d/redmine.conf: Cannot load {home_dir}/.anyenv/envs/rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/passenger-5.1.12/buildout/apache2/mod_passenger.so into server:{home_dir}/.anyenv/envs/rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/passenger-5.1.12/buildout/apache2/mod_passenger.so: failed to map segment from shared object: Permission denied

どうやら手順の1番最初に書かれているselinuxの設定を無効にしなかった事が原因のようです。(ちゃんと手順書に従いましょう!)

 

インストールできると↓のような画面が出ます。(背景が白色で見えにくいです...)

こちらはホームです。

f:id:e-horoyoi:20180108221848p:plain

 

こちらはプロジェクト

デフォルトでガントチャート、カレンダーがあります!

f:id:e-horoyoi:20180108221851p:plain

 

Redmineのインストール自体はそんなに難しいとは感じませんでした。

興味のある方は試してみては如何でしょうか。

クラウドを借りて日々のタスクをRedmineで管理するのも良いかも知れませんね。

 

ざっくりした記事になってしまいました。

次回はRedmineプラグインをインストールする作業をやって見たいと思います。

 

最後までお読みいただきありがとうございます。

PHPの正規表現について

お久しぶりです。

漸くMacの修理が完了しました。

修理と言うよりHDDが完全に逝ってしまったのでバラして付け直しです...

ところで、Pythonの続きを書こうかと思っていたのですが、脳みそがお爺ちゃんの私にはどうしてもPHP正規表現をメモしないといけない事情があり別途PHPの内容で更新します。

 

やりたい事

あるタグのある属性(文字列)を正規表現で抜き出したい。

 

こうやる

$str = '<html><head><title>test</title></head><body><form><input type="text" name="name" value="100"></form></body></html>';
$result = preg_replace('/\A(.+)(<input)([^>]+)(name="name")([^>]+)(>)(.+)\z/', '${5}', $str);
print($result);
print("\n");

 

ざっくり書いてあるのである程度はアレンジが必要です。

PHPに限らず使用できると思うので参考になれば幸いです。

 

以上、最後までお読みいただきありがとうございます。

 

PythonのClassにチャレンジしてみよう

はじめに

今回からPythonのクラスをやります。

因みに、ここに書かれている事を理解するにはオブジェクト指向が理解できている事を前提としているのですが、Pythonでは完璧なオブジェクト指向のプログラミングは実現できません!

それはドキュメントにも書いてあります。

アクセス権の指定(privateなど)が無いのです。

9. クラス — Python 3.6.1 ドキュメント9.6. プライベート変数を参照)

...ややこしいですね。

私もどう説明していいか分かりません。

正当なルートで勉強するなら"オブジェクト指向Pythonのクラス"だと思います。 

そのため、最初に書いたようにオブジェクト指向が理解できている事が前提としております。 

 

ちょっとだけオブジェクト指向について

先ほどから"オブジェクト指向"と書いていますが、オブジェクト指向概念になります。

そしてクラスはその概念に沿って組み立てる設計図になります。(間違っていたら指摘お願いします。)

 

クラスのアレコレ

クラスをプログラムで記述する時、"class"という予約語があります。

このclassでクラス定義を宣言します。

また、クラスは初期化(initialize)、メンバ変数(プロパティ変数)、メソッドという用語が頻繁に登場します。(下記で簡単な説明します。 )

 

兎に角書いてみる

説明ばかりだと疲れるので、とりあえずプログラムをGitHubにアップしてあるので確認お願いします。

github.com

↓こんなソースになっています。

#
# Sample
#
class Member:
    def __init__(self, name=''):
        """ Initialize the Member class.
        """
        self.name = name

    def get_property(self, value_name):
        """ Get properties of this class.
        """
        return getattr(self, value_name, 'non name')

    def set_property(self, value_name, value):
        """ Set properties of this class.
        """
        setattr(self, value_name, value)

    def bad_arguments(self, value, values=[]):
        """ Bad argument initialization example.
        """
        values.append(value)
        self.bad_values = values

#
# How to handle classes.
# initialize
# getter and setter
member = Member('taro nihon')

# Get "name" property.
print(member.get_property('name'))

# Override "name" property.
member.set_property('name', 'hanako nihon')
print(member.get_property('name'))

# Create "country" property.
member.set_property('country', 'Japan')
print(member.get_property('country'))

# Notes on method arguments.
member.bad_arguments(1)
member.bad_arguments(2)
member.bad_arguments(3)
print(member.bad_values)

 

上記のclass Memberが"Memberクラス"になります。

その中でdefと宣言されている関数がメソッドといいます。

また、"__init__"と名前が付いたメソッドが有りますが、これはクラスを初期化(initialize)する時に呼ばれます。

その中で宣言されているself.nameが"Memberクラスのnameプロパティ変数(メンバ変数)"といいます。

 

実体化(初期化)

クラスはあくまで設計図です。

実際に設計図から実体化するのが、"member = Member('taro nihon')"になります。

この時、ローカル変数memberにMemberクラスが実体化(初期化)され代入されます。

 

すごい中途半端ですが、この辺で今日は終わりたいと思います。

なぜなら疲れたから。

それに新しい事ばかりで理解するのに疲れると思うので。

次回は引き続きサンプルを使用してクラスのメソッドについて説明したいと思います。

 

最後まで読んでいただきありがとうございます。

 

 

Pythonで関数を定義する その3

はじめに

前回の説明でモヤモヤはスッキリしましたでしょうか。

それとも、もっとモヤモヤしましたでしょうか。

あの説明が私の限界なので次に進めます。 

e-horoyoi.hatenablog.com

 今回は任意引数リストのお話です

いくつかの言語を経験されている方でしたら『関数に与える引数を任意に指定したい!』という時があったと思います。(無かった人はあった事にしてください。)

そんな希望を叶えてくれるのが任意引数リストです。

 

任意引数リストって何?

簡単に説明してしまえば引数を任意の数だけ指定できるという事です。

下記のような書き方をします。

def any_args(arg1, *arg2, **arg3):
    print("arg1: ", arg1)
    print("-" * 40)
    for arg in arg2:
        print(arg)
    print("-" * 40)
    for kw in arg3:
        print(kw, ":", arg3[kw])

print("\n===任意引数サンプル===")
any_args("arg1_value",
         "arg2_value1",
         "arg2_value2",
         arg3_1="arg3_value1",
         arg3_2="arg3_value2",
         arg3_3="arg3_value3")

 

 このように可変する引数に対応できる柔軟な書き方が引数名の前に"*"、"**"を指定する事で実現できます。(上記のサンプルでいう*arg2*、*arg3になります。)

GitHubにサンプルプログラムを追記したので実際に動かして確認できます。

github.com

 

関数の定義についてはこの辺で終了したいと思います。

次回はクラスかな...まだ決めてないです。

 

以上、最後までお読みいただきありがとうございます。