三蔵開発メモ

Web開発やインフラ関連のメモを共有します

PHPStorm(又はintellij)で、json_encode関数を使うとアラートが出る

json_encode関数はそもそもデフォルトで使えるものだが、注意を促される。

なぜかということについては、こちらで詳しく原因を書いてくれている。 blog.pinkumohikan.com

具体的な解決方法は、composer.jsonファイルのrequire内に
ext-jsonを追加してあげれば良い。

"require": {
        "php": ">=5.6",
        [中略]
        "ext-json": "*"
    },

mongodbでjavascriptを使って処理を実行するとき外部引数を設定する方法

概要

mongodbでは、jsファイルを実行して複雑な処理をすることができるが、その時外部引数を設定する方法があるのでメモ。

mongodbで実行するためのjsを用意

testというdbに、commentsという「_id(mongoid)」と「insert_date(datetime)」と「comment(string)」のカラムを持つコレクションがあるとする。

vi test.js
var startDate = ISODate(STARTDATE+'T00:00:00+09:00');
var endDate = ISODate(ENDDATE+'T23:59:59+09:00');
db.comments.find({"insert_date":{$gte : startDate, $lte : endDate}).sort({"insert_date":1}).forEach(function(record) {
  print(record._id + "," + record.insert_date + "," + record.comment);
});

スクリプトを実行

--evalオプションを使う。この場合、上記スクリプトのSTARTDATEが2019-04-01、ENDDATEが2019-04-30となる。
動的に日付をコマンド実行時に変えられるので、cronなどで実行することができるようになった。

mongo test --eval "STARTDATE='2019-04-01';ENDDATE='2019-04-30';" test.js --quiet > comments.csv

MacでLinuxなどでよく使うコマンドをターミナルに設定

centosなどで使うllコマンドがMacでは使えないので、エイリアスを追加。

vi ~/.bash_profile

以下を追加
※ついでに色分けするオプション(G)と、フォルダに「/」が足される(F)追加したコマンドを足しています。

alias ls="ls -FG"
alias ll="ls -FlG"

設定反映をする

source ~/.bash_profile

黒背景の場合、上記設定のみだと見づらい場合があるので、以下の設定を「.bash_profile」に追加

export LSCOLORS=xefxcxdxbxegedabagacad

青地の反転になるので、見やすくなるはず。
※LSCOLORSの後の文字列の2つ目「e」が文字の背景色なので、eをdとかcに変えれば色が変わるので、好みの色にすることができます。

python3.7でvenvでの開発環境を作る

python3.7の開発環境をvenvで作る

概要

pythonの仮想環境を作るやり方は沢山あるが、公式チュートリアルにあるやり方をベースにした。
python3.7をインストールして、venvで実行できるようにする。

  • python3.7
  • venv
  • macOS 10.14
  • homebrew

python3.7インストール

brew update
brew install python3
python3 -v
(3.7.3がインストールされていることが確認できる。ctrl+Dで抜ける)

venv環境のフォルダを作る

test-envという名前のvenv環境を作る

mkdir test-env
cd test-env
python3 -m venv test-env

ターミナルでvenv環境に入る

上記までの作業をやると、test-envフォルダに色々とファイルが作られるので、以下のコマンドを実行する

source test-env/bin/activate

すると、ターミナルが、

(test-env) $ 

上記みたいになるので、この状態でpipインストールや、python3コマンドでスクリプトなどを実行すると、test-envのみで有効になる。
その場合、test-envフォルダ内でやらなくてはいけないということはなく、別途フォルダを作ってそこで実行したりしても良い。

Go 1.12 のローカル環境構築、Modulesを使えるようになるまで(MacOS版)

概要

  • mac OS 10.14
  • Homebrewインストール済み

Homebrewでgoをインストール

brew update
brew install go
go version
(go version go1.12.4 darwin/amd64)

goenvもいれる

brew install goenv
vi ~/.bash_profile

bash_profileに以下を追加

export PATH="$HOME/.goenv/bin:$PATH"
eval "$(goenv init -)"

詳しい使い方はここを参考にしました。

qiita.com

バージョンをbrewで入れたものに戻したい場合は、

goenv global system

と入れる。

GOPATH設定

bash_profileに以下を追加

export GOPATH=$HOME/go

この場合は、ホームフォルダ直下にgoというフォルダを作って、その下がGOPATHになる。
必要に応じて好きな場所に変えても問題ないです。

modulesを使う

go1.12だとデフォルトでmodulesが使えるようになっている。

適当な場所でフォルダを作り、その中で、

go init

すると、go.modフォルダが作られる。 あとはimport文に適当なライブラリを書いて、

go build

すると自動で持ってきてくれる。go getしてもOK。

具体例

たとえば、

github.com

上記のライブラリを使いたいとき、以下のようなソースコードをmain.goに書くとする。

package main

import (
    "fmt"
    "github.com/julienschmidt/httprouter" // これが使いたいgo getも特にしていないライブラリ 
    "net/http"
    "log"
)

func Index(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
    fmt.Fprint(w, "Welcome!\n")
}

func Hello(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
    fmt.Fprintf(w, "hello, %s!\n", ps.ByName("name"))
}

func main() {
    router := httprouter.New()
    router.GET("/", Index)
    router.GET("/hello/:name", Hello)

    log.Fatal(http.ListenAndServe(":8080", router))
}

そして、以下を実行すると自動で上記ライブラリを持ってきてくれる。

go build main.go

※go.modファイルには上記ライブラリが追加されている。

Goにおけるフォルダ(パッケージ)分け

Go言語の勉強を始めたので、基本のメモ。

環境

Go 1.12

フォルダ分け

Goはmain関数があるmainパッケージが処理の拠点として存在するが、 処理を切り分けたい場合はパッケージを作る。 以下の内容が書かれた、「main.go」というファイルがあるとする

package main

import (
    "fmt"
)

func main() {
    fmt.Println("hello world")
}

これをあえて以下のように切り分けたい場合

/prj
┣ main.go
┗ /print/print.go

print.goは以下のようにする

package print

import (
   "fmt"
)

func PrintHello(){
     fmt.Println("hello world")
}

main.goは以下のように書き換える

package main

import (
    "print"
)

func main() {
    print.PrintHello()
}

こちらのmain.goを実行すると最初に書いたmain.goと同じ動きをする。
fmtはprint側で呼び出して使っているため、importの必要がなくなる。
また、printとpackageに指定したprint.goを呼び出すときは、
importを使って呼び出す。
そうすると、「PrintHello」のように最初が大文字で設定してある関数はパブリックなため、
「パッケージ名.関数名」で呼び出すことができる。

その他

import(
   . "print"
)

上記のように「.」をimportするパッケージ前につけると、print.PrintHello()みたいにパッケージ名を前につけないで呼び出すこともできる。 「.」の代わりに「pri」とかつけてパッケージ名を指定のものに変えることもできる。

ネストしてるパッケージ

/prj
┣ main.go
┗ /print/printutil/print.go

上記のような階層にした場合は、

import (
"print/printutil"
)
main(){
  printutil.PrintHello()
}

上記のように呼び出す、print.goのパッケージ名はこの場合は「printutil」とする。

CentOS7とapache2.4で/tmp直下にファイル等を保存したりしたい時

privateTmp機能をoffにする
※セキュリティが下がるのでなるべく注意

/lib/systemd/system/httpd.service
---
PrivateTmp=true
↓
PrivateTmp=false
---
systemctl daemon-reload
systemctl restart httpd