Scalaアレコレ

文字列の前後にあるダブルクォーテーションを削除

以下のような形式のJSONJSON文字列的にparseしようとしたら構文エラーとなってしまった。

"{\"hoge\":{…}…, \"hogehoge\":\"geho\"}"

最初と最後にダブルクォーテーションが入っているのが原因だったので、以下のようにして取り除いた。

// まずエスケープとして入ってしまっていたバックスラッシュを取り除く
val jsonDataWithoutEscape = StringContext treatEscapes(jsonData.toString())

// 頭と後ろのダブルクォーテーションを削除
val jsonStr = jsonDataWithoutEscape.dropWhile( _ == '"' ).reverse.dropWhile( _ == '"' ).reverse

Jacksonを用いて複数階層を掘り下げつつ不要な要素を削除する

処理の流れ
  1. Json文字列からObjectNodeを生成
  2. ObjectNodeから削除したいfieldに対してremoveを実行
  3. 返されたJsonNodeからObjectNodeを生成
  4. 階層に応じて上記02〜03を繰り返す
ソースコード
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.databind.node.ObjectNode

val jsonStr =
"""{"A":{.....}, "child":{"B":{}, "child":{....}, ....}} // 「親→子1→子2」の3世代
""".stripMargin

val parentObjectNode = mapper.readTree(jsonStr).asInstanceOf[ObjectNode]
val child1JsonNode     = parentObjectNode.remove("child") // 戻り値としてAが返され、parentObjectNodeからchildが削除される
val child1ObjectNode  = mapper.readTree(childJsonNode.get(0).toString).asInstanceOf[ObjectNode]
val child2JsonNode     = child1ObjectNode.remove("child")

文字列を区切り文字で区切って配列にしたり等

  val moji = "hoge:hohoge, geho:gegeho"
  val arr1 = moji.split(",")
  val hoge = arr1.map ( a=> {
    val arrlast = a.split(":")
    Map(arrlast(0) -> arrlast(1))
  })
  log.info(s"### ${hoge(0)} ###")
更に文字列の中身が数値だったらInt型に、そうでなければ文字列のままにしておく処理
      val attributes = mojiretsu match {
        case Some(attr) => {
          val arr = attr.split(":")
          val value = try {
            arr(1).trim.toInt
          } catch {
            case _:NumberFormatException => arr(1).trim
          }
          Map(arr(0)->value)
        }
        case _ => Map[String, Any]()
      }

買って良かったもの2018

ヘアドライヤー

NB1903ヘアードライヤーブラック NB1903

NB1903ヘアードライヤーブラック NB1903

美容院御用達で風力強めで乾かしやすい。大きいのがネック。


無線Wi-Fiルータ

コレ以前に使っていたのはAirMacExpressでちょいちょい切断されていたが、コレに替えてからは全く切断しなくなった。

nasne

iPhoneで遠隔からでも録画できるので、テレビ番組の見逃しを気にすることがなくなった。

アパガードロイヤル

アパガードロイヤル 135g

アパガードロイヤル 135g

「これは歯医者さんじゃないと白くデキません」と言われた歯が白くなりつつある。


ワインオープナー

ワインのコルク栓がアッサリ抜けるようになった。

git mergeに失敗

最新のmasterを現在の開発ブランチ(こちらも最新で全てのファイルがcommit済み)にmergeしようとしたら怒られた。

Please commit your changes or stash them before you merge.
Aborting

とあるファイルがマージできないと言われていたのだが、git stashした後にgit mergeを試みたら上手く行った…

DockerコンテナにDjangoを入れて起動してみた

概要

そろそろDockerを触ってみたいと思ったのと、どうせ触るならPythonやらDjangoも使ってみようと…ということで軽く試してみました。

  • 今回触れたもの一覧
    • Dockerイメージ(CentOS)
    • Python3.6
    • Django2.1
    • Django REST Framework2.0.0
    • MySQL5.7

Dockerコンテナ起動まで


Dockerイメージ(CentOS)をPullしてくる

docker pull centos


適当なIPを指定してDockerコンテナ(CentOS)を起動しつつログイン

docker run -it -p 8000:8000 centos /bin/bash

PythonDjangoのインストール


Python3系インストールのためのリポジトリをインストール

yum install -y https://centos7.iuscommunity.org/ius-release.rpm


Python3.6をサーチしてみる

yum search python36


Python3.6と関連するものをインストール

yum install -y python36u python36u-devel python36u-libs


"python3"と打てばPythonコマンドが有効になるよう、シンボリックリンクを張る

ln -s /usr/bin/python3.6 /usr/bin/python3


pipをインストール

yum install -y python36u-pip


インストールされたpipのバージョンが古いのでアップグレードする

/usr/bin/pip3.6 install --upgrade pip


DjangoDjango REST Framework、Django-Filterをインストール

pip install django
pip install djangorestframework
pip install django-filter

Djangoのプロジェクトとアプリを作成し、起動


Djangoがインストールされたディレクトリに移動

cd /usr/local/bin/


Djangoのプロジェクトを作成

django-admin.py startproject myprj


プロジェクトのルートディレクトリに移動

cd myprj


アプリを作成

python3 manage.py startapp myapp


マイグレーションを実行

python3 manage.py migrate


アプリを起動してみる

python3 manage.py runserver 0.0.0.0:8000


アプリ起動用のスクリプトを作っておく

vim /usr/local/bin/init.sh
python3 /usr/bin/myprj/manage.py runserver 0.0.0.0:8000
while true ; do
    /usr/bin/fish
done

MySQL5.7のインストール


インストール用リポジトリのインストール後、インストール実行

rpm -ivh http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm

yum -y install mysql-community-server


MySQLのrootユーザーのパスワードを確認

cat /var/log/mysqld.log |grep password
→パスワードが表示されるのでコピー等しておく


MySQLのセキュリティ設定を行う

mysql_secure_installation
※先程確認したパスワードと、新しいパスワード入力を求められる


root以外のユーザーを作成

grant all privileges on *.* to hoge@localhost identified by '任意のパスワード' with grant option;

flush privileges;


データベースを作成

create database myapp_db;

Django側のMySQL関連設定

PyMySQLのインストール

pip install PyMySQL


manage.pyにPyMySQLの設定を追記

vim manage.py
import pymysql
pymysql.install_as_MySQLdb()


settings.pyにMySQLの情報を追記

vim settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME':'myapp_db',
        'USER':'hoge',
        'PASSWORD':'hogeのパスワード',
        'HOST':'localhost',
        'PORT':'3306',
        'OPTIONS': {
            'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
        },
        'TEST': {
            'NAME': 'test_sample'
        }
    }
}


マイグレーション実行

python3 manage.py makemigrations
python3 manage.py migrate


Ctrl+p,Ctrl+qでコンテナから抜けた後、コンテナをDockerイメージとして保存

#起動中のコンテナのコンテナIDを確認
docker ps
#コミットして保存
docker commit コンテナID mychuno_myapp


Dockerコンテナを止める

docker stop コンテナID

ホストからDockerコンテナを立ち上げた後、アプリを起動

Docker起動後にMySQLも起動

  • 先程保存したDockerイメージを用いる
  • -vオプションでホストの任意のディレクトリにバックアップできるようにしておく
docker run -it -p 8000:8000 -v /Users/hchuno/projects/docker_myapp/mychuno:/usr/local/bin/myprj_bk --privileged mychuno_myapp /sbin/init


Dockerコンテナにログインしてアプリを起動

docker ps

docker exec -it CONTAINER_ID /usr/local/bin/init.sh /bin/bash

git-svn関連

業務で使ったgit-svnコマンド

チェックアウト

$ git svn clone <url>

# 最新のリビジョンだけを取得する
$ git svn clone -r HEAD <url>

ブランチを最新にする

$ git svn rebase

コミットする

$ git add
$ git commit
$ git svn dcommit

ローカルの作業ブランチをリモートブランチ(trunk)とマージする際の手順

  1. git stash
  2. git checkout master
  3. git svn rebase
  4. git checkout <作業ブランチ名>
  5. git merge master
  6. git stash pop
  7. git commit
  8. git checkout master
  9. git merge <作業ブランチ名>
  10. git svn dcommit

psqlコマンドでRedshiftにSELECT文を流し、その結果をファイルに出力する

$ psql -h ホスト名 -p パスワード -U ユーザー名 -c "SELECT文" -A -F, > ./hoge.csv