SDice技術メモ

技術備忘録や仕事関連でやったこと

Dartを試してみた

Dartを試してみました

仕事から少し離れてたプログラムをやってみようと最近思うことがありまして、Dart2の安定版が出たとのことでしたのでやってみることにしました。
仕事じゃないプログラミング楽しいなあと。

趣味なのであんまり無理せず学んで行こうかと。
フレームワークのFlutterとかでアプリとか出してみたいですね。

本当はHomebrewを使ってインストールした方がいいようですが、とりあえず動かしたくて、MacSDKダウンロードして、bash_profileにPATH通して実行してます。

ハローワールドをとりあえず書いてみました。なんだかJavaとJSを併せたような構文で、出力が「print」と短いのがいいですね。

変数はJSみたいにvarで宣言できますし。配列も同じですね。
AltJsみたいにJSに変換できるらしいですしね。
連想配列も同じような感じですね。

void main() {
    // 標準出力
    print('Hello World!');

    // 配列
    var list = ["val1","val2","val3"];
    for(var i in list){
      print(i);
    }
  
    // 連想配列
    var data = {"ccc":"aaaa"};
    print(data);

}

ドキュメントに下記のようなコマンドでJSへ変換できるっぽいこと書いてました。

$ dart2js --out=basic_usage.js basic_usage.dart

上記のコードで試してみると
basic_usage.js
basic_usage.js.deps
basic_usage.js.map
の三つのファイルが作成されました。
中のコード量も物凄く増えてる...。
公式ドキュメントをちゃんと読んで使わないとダメですね...。
申し訳ありません。

ApatchにDjangoプロジェクトをデプロイ(mod_wsgi)

ApatchDjangoプロジェクトをデプロイ(mod_wsgi)

前回(AWSへvirtualenvを使用してPython3環境作成 (virtualenv))の記事からの続き。
Python3とvirtualenvがインストールされてる状態です。
※ 以下管理者ユーザで実行

環境
OS:Amazon Linux 2
PythonPython 3.7.0
Apatch : 2.4.34
mod-wsgi: 4.6.4

Apatchをインストール

Apatchyumコマンドでインストールします。
Complete!が最後に表示されたら完了です。

AWSを使用している場合ブラウザからApatch公開画面を参照する為にはhttpの参照を許可する必要があります。

$ yum -y install httpd
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
...
Complete!

httpd-develをインストール

httpd-develをyumコマンドでインストールします。
Complete!が最後に表示されたら完了です。

$ yum install -y httpd-devel
...
Complete!

python3-develをインストール

python3-develをyumコマンドでインストールします。
Complete!が最後に表示されたら完了です。

$ yum install -y python3-devel
...
Complete!

gccをインストール

gccyumコマンドでインストールします。
Complete!が最後に表示されたら完了です。

$ yum install -y gcc
...
Complete!

env環境作成と実行

venvコマンドで/var/www配下へenvコマンドを作成します。

$ mkdir /var/www/envs
$ cd envs
$ python3 -m venv myenv

mod_wsgiインストール

作成した環境をactivateした後、pipコマンドにて「mod_wsgi」をインストールする。
Successfully installed が表示されたら完了。

$ source myenv/bin/activate
$ pip install mod_wsgi

Apatchにmod_wsgiの設定ファイルを作成

「/etc/httpd/conf.d」配下に設定ファイル(xxxx.conf)ファイル作成

# venvで作成した環境モジュール
LoadModule wsgi_module /var/www/envs/myenv/lib/python3.7/site-packages/mod_wsgi/server/mod_wsgi-py37.cpython-37m-x86_64-linux-gnu.so 

# venvで作成した環境フォルダパス
WSGIPythonHome [env path] 

# Djangoで作成したプロジェクトフォルダパスを記載
WSGIPythonPath [Django Project Path]

# Djangoで作成したアプリケーションフォルダパスを記載
WSGIScriptAlias / [Django AP Path]/wsgi.py

# Djangoで作成したアプリケーションフォルダパスを記載
<Directory [Django AP Path]>
<Files wsgi.py>
Require all granted
</Files>
</Directory>

Apatch再起動

設定を反映させて為に、Apatchを再起動させます。

$ service httpd restart

AWSへvirtualenvを使用してPython3環境作成 (virtualenv)

AWSへvirtualenvを使用してPython3環境作成

作成システムの公開の為、AWSサーバへPython3(virtualenv)をインストールしました。
今後のことを考えて手順を残しておこうと考えました。

環境
OS:Amazon Linux 2

Pythonバージョン確認

AmazonLinuxには最初からPython2がインストールされていますので、現在入っているPythonバージョンを確認します。
※ 以下管理者ユーザで実行

$ python -V
Python 2.7.14

yumコマンドのアップデート

作業前にyumコマンドを最新化する。

$ yum update
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
Resolving Dependencies
...
Complete!

python3をインストール

Python3をyumコマンドでインストールします。
Complete!が最後に表示されたら完了です。

$ yum -y install python3
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
amzn2-core                                               | 2.4 kB     00:00     
Resolving Dependencies
--> Running transaction check
...
python3-setuptools.noarch 0:38.4.0-3.amzn2.0.6                                

Complete!

virtualenvをインストール

virtualenvをeasy_installコマンドでインストール
Finished が表示されたら完了です。

$ easy_install virtualenv
Searching for virtualenv
...
Processing dependencies for virtualenv
Finished processing dependencies for virtualenv

env環境作成

virtualenvを使用してenv情報を作成する。
下記の例は「testenv」という名前で作成する場合です。

$ python3 -m venv testenv
$ ls
testenv

env環境の有効化

作成した環境を有効化しました。
有効化されるとコマンドプロンプの前に環境名が(環境名)で表示されます。
その状態でPythonバージョンを確認すると3系が表示されます。

$ source testenv/bin/activate
(testenv)# python -V
Python 3.7.0rc1

env環境の終了

終了する場合は「deactivate」で終了します。
終了するとコマンドプロンプトが元に戻ります。

(testenv)$ deactivate
$

フリーランスになる時にやる事

フリーランスになる時にやらないといけない事、又やるべき事を一旦まとめました。
周りにいらっしゃるフリーランスの先輩などから聞いたりして、実際私がやった事です。
中にはまだ現在進行形の物もありますが、調査したことやこれから確認しないといけない事も備忘録として残しておこうと考えてます。

  1. 退職手続き
  2. メールアドレス作成(ドメイン取得)
  3. 開業届けと青色申請
  4. 会計ソフトの導入、銀行講座作成
  5. 厚生年金→国民年金(退職した日から14日以内)
  6. 健康保険(退職した日から14日以内)
  7. サーバ契約(AWS)
  8. GitHub登録
  9. ブログ開設
  10. クレジットカード作成
  11. 仕事用携帯番号作成

退職手続き

私はフリーランスになると決めた時にすぐに手続きを始めました。
どんなに考慮しても退職時には嫌な思いをする会社もあると思うのですが、できる限り円満に退職したいものですね。
最初の案件は知人の紹介での案件を引き受けようと思ったので、早めに現在の仕事にけじめをつけ、できるだけ迷惑のかからないタイミングで引き継ぎを行おうと考えていましたので会社への報告を致しました。
それでも、色々な方々に調整で動いて頂く事になり本当に感謝しています。
最終的には、お世話になっていた事業部等や上長とは円満退職として握手をして退職できた事は本当によかったなと思っています。

メールアドレス作成(ドメイン取得)

最近では色々な手続きをする時にメールアドレスを記載しますので、まず始めに取りかかりました。
仕事用メールアドレスとプライベートアドレスを分けると便利いいですしね。
知人に教えてもらった、GSuiteを使用してメールアドレスを取得しました。
G Suite の料金プラン
ドメインの取得も合わせて行いました。
屋号なんかもこのタイミングで検討することになりました。
シンプルでどのような業務を行うかわかりやすい方が良いようですね。

開業届けと青色申請

開業届けと青色申請等は開業前にも提出できるそうです。
パフォーマンスを求められる開業後より開業前に手続きを済ませた方が、良いのではないかなと思います。
freeeというサービスで本当に簡単に手続きできました。
会計ソフト freee (フリー) | 無料から使えるクラウド会計ソフト

すべての公的手続きがこのような形で簡単にできれば良いかなと思っています。

会計ソフトの導入

フリーになる時に1番の問題点になるのが、会計手続き等の作業ですね。
今回は上記のfreeeというサービスを使ってみる事にしました。
会計ソフト freee (フリー) | 無料から使えるクラウド会計ソフト
一年間使ってみて、よくなかったら変更してみようと考えています。
銀行口座も分けた方が、会計手続きを行いやすそうだったので合わせて手続きしてみました。
屋号入りの口座が作成できたら良いなと思っています。
現在私はジャパンネット銀行で手続き中です。

厚生年金→国民年金

会社員から自営業になる場合に手筒きする必要がある。
第2号被保険者から第1号被保険者への変更手続きとなり、自身で手続きを行う必要が出てくる。
厚生年金(第2号被保険者)の脱退手続きについては会社側が行ってくれるので問題ないが、国民年金(第1号被保険者)への加入続きを行わないといけない。
退職日から退職日から14日以内に、居住地の市区町村役場の国民年金担当窓口での手続きを行う。
年金手帳または基礎年金番号通知書に加え、退職証明や離職票などの退職日の分かる書類、
免許証など身分証明書が必要となる。
居住区のホームページにて確認してから手続を行った方が良さそう。
加入する自治体によって金額が異なるので注意が必要。

健康保険

退職後に「国民健康保険」へ加入が必要と聞くが、別に「国民健康保険」でなくても、代用できる保険に入る必要があるとのこと。
「配偶者や家族の被扶養者」や「社会保険を任意継続」、デザイナーだと「文芸美術国民健康保険組合」等があるそうです。
私の場合は「社会保険を任意継続」を選択しました。
ただし退職から2年間らしいので2年後に切り替えを再検討する予定です。

サーバ契約(AWS)

ホームページや自主学習、開発システムの運営などを行うためAWSサーバ契約を行いました。
インスタンス保持しているとお金がかかるので、必要な時に必要なインスタンスを作成しています。
このブログもタイミングをみて、自作のブログのシステムを書いたらそちらに載せ変えようかなとか考えています。
AWS を無料でお試しください | アマゾン ウェブ サービス(AWS 日本語)

GitHubの登録

今後勉強のために作成したソース管理などはすべてGitHubに載せていこうかなと思っています。
GitHubには「GitHub Pages」などのサービスもあり静的ページの公開も簡単に行えるので色々便利なと考えています。

ブログ開設

ブログやホームページで自身のやっていることをまとめることはフリーランスになった時に必要かなと考えました。
個人的にはあまりそういった作業をしてこなかったので、正直後悔しています。
しかし何事も挑戦、新しいことを始めることを恐れていたらエンジニアとしての先はないと思い今回このブログを作成しました。
一旦はてなブログに記事を書き溜めておき、自作のシステムが作成できたらそちらに記事を写したいと思っています。

クレジットカード作成

仕事用のクレジットカードがあれば会計を行う時にわかりやいと考えて作成することに致しました。
私は屋号を登録できそうなので、ライフカードさんで作成することに致しました。

仕事用携帯番号

携帯番号なども仕事用の番号を取得することにしました。
BIGLOBでSIM契約を行いました。
デュアルSIM対応の携帯端末で仕事用とプライベート用の連絡を同時待ち受けの構成にしています。

こんな感じで現在進行形でフリーランスになるべく準備を行っています。
日々色々なことがありますが、正直ワクワクしているのが本音ですね。

Pythonでの並列処理

Pythonを使用して並列処理を記載しました。
書いている時に、スレッドが動作するタイミングがfor文が最後まで動作後に実行されてしまったり、Exceptionが出力されないなど気づくことが多くありましたので、備忘録として残そうと思いました。
中々細かい点が思い道理にサクッと書けないことに、自分の力不足を感じます。
なんとか実力をつける為、とにかく毎日書きまくるしかないのかなと。。。

サンプルとして下記のソースを記載しました。
IDが記載されたファイルからIDリストを取得し、ID毎に並列処理でファイル検索を行うサンプルです。

# coding:utf-8
import time
import glob
import os
import traceback
import concurrent.futures

from functools import partial


def print_time(func):
    """
    実行時間計測用デコレータ
    """
    def wrapper(*args, **kwargs):
        t1 = time.time()
        print("START")
        func(*args, **kwargs)
        print("END")
        t2 = time.time()
        print("経過時間{} 's ".format(t1 - t2))

    return wrapper


def find_file_path(data_dir, id):
    """
    ディレクトリ配下のIDファイルを検索
        Args:
            data_dir (str):検索ディレクトリ
            id (str):検索ファイルID
        Returns:
            file_dict(dict) 拡張子ごとにパスを格納した辞書
    """
    # 検索使用するパス
    find_path = os.path.join(data_dir, "**", "*" + id + "*")
    # フォルダ内を再起的な検索
    files = glob.glob(find_path, recursive=True)

    # 検索後にdictに格納する拡張子
    extensions = ['xml', 'txt', 'py']

    # 辞書作成
    file_dict = {}
    for file in files:
        for extension in extensions:
            if file.endswith(os.extsep + extension):
                file_dict[extension] = file

    return file_dict


def create_thread(data_dir, id_list):
    """
    スレッド作成ジェネレータ
    Args:
        data_dir (str):検索対象のディレクトリ
    Returns:
        thread:ID単位のスレッド
    """
    for id in id_list:
        def _thread(id):
            """
            スレッド実行(id単位)
                Args:
                    id (id):id
            """
            try:
                files = find_file_path(data_dir, id)
                print(files)
            except Exception:
                traceback.print_exc()

        yield partial(_thread, id)


def get_id_list(file_path):
    """
    IDリスト作成
        Arags:
            file_path (str):ファイルのパス
        Returns:
            id_list(list):idリスト
    """
    id_list = []
    with open(file_path, 'r') as f:
        for line in f:
            # 改行コード削除してリストへ追加
            id_list.append(line.rstrip('\n'))
    return id_list


@print_time
def main():
    """
    メイン処理
    """
    # idリストファイルよりidリストを取得
    id_list = get_id_list('./id_file.txt')

    # スレッドジェネレータ作成
    threads = create_thread('./data_dir', id_list)

    # スレッドプールからスレッド実行
    executor = concurrent.futures.ThreadPoolExecutor(max_workers=10)
    for thread in threads:
        executor.submit(thread)


if __name__ == "__main__":
    main()

Pythonでの複数行のテキストへの正規表現

Pythonを勉強中なのですが、正規表現を試していると「^」が効かないみたいな感じで焦ってしまいました。

使用した構文はこの様な感じです。
修正前:

# coding:utf-8
import re

target = """
ccccc
dcccc
fddddd
"""
# 正規表現検索部分
ans = re.search("^d", target)
if ans is not None:
    print(ans)

問題は正規表現検索部分だったらしく、下記の様に関数searchに「flags=re.MULTILINE」を引数で渡さないと「^」が上手く効かないようです。
修正後:

# coding:utf-8
import re

target = """
ccccc
dcccc
fddddd
"""
# 正規表現検索部分
ans = re.search("^d", target, flags=re.MULTILINE )
if ans is not None:
    print(ans)

関数の仕様確認を怠ってしまい反省ばかりです。

ブログ始めてみます。

SIerの会社からフリーランスになったのを機にブログを始めてみました。

技術的なことの備忘録として使ってみようと考えています。

 

正直スキルはいまいちかもしれませんが、毎日少しずつ勉強することによって少しはましなエンジニアにありたいと考えています。