bz0のにっき

quick and dirty prototype

CSV読込して配列化 その2

CSV読み込むときに気を付けることをまとめてみました。

メモリを極力使わないようにする

ストリームを利用する

・大容量のCSVを読み込む際はストリームで「文字コード変換」を行う
 ストリームを利用すればメモリサイズを気にしなくてよくなる為

・ストリームフィルタを利用する際、iconvフィルタの利用は避ける
 iconvフィルタは不正なバイトが含まれていると全体を0バイトに変換してしまう
 http://d.hatena.ne.jp/hnw/20090317

CSVを一度に配列化してしまうと容量が大きい場合メモリを食いすぎる
 「 Stream_Filter_Mbstring」を使ってファイルを一行ずつ取得する
 http://nob-log.info/2012/04/17/stream_filter_mbstring/

エンコードの扱い

・文字エンコーディングの取り扱いはphpの各関数の実装に委ねられる

ロケールについて

・fgetcsv()はsetlocaleの影響を受ける
 ロケールhttps://wiki.archlinux.jp/index.php/%E3%83%AD%E3%82%B1%E3%83%BC%E3%83%AB
 
 ・ロケールとは
   ロケールはOSが持っている多言語対応の仕組み。
  利用する言語 / 文字エンコードの設定を行うことが出来る。

 ・環境によりsetlocaleが効かない
  https://mgng.mugbum.info/1014
  ※Windows では setlocale(LC_ALL, 'ja_JP.UTF-8') は効かない

・setlocaleの挙動はOSのロケールの挙動に依存しており
 かつ大抵の環境の Shift_JISロケールは腐っている

ロケール設定はプロセス全体に影響する。
 マルチスレッドサーバで実行した場合、ほかのスレッドのロケール設定に影響を受ける

結論

・fgetcsv()はロケールに影響を受ける
 環境によってsetlocaleが効かない / マルチスレッドサーバで実行したときに他のスレッドの
 ロケール設定に影響を受けるかもしれない事に注意する。

・大容量のCSVの読込を行う場合は、メモリ対策の為にストリームを利用する

knife-soloのインストール

vagrantの仮想環境が、ネットワーク設定をいじってたら壊れたので
新しく作ったのですが、軽い気持ちでknife-soloでサーバ自動構築しようと考えて
knife-soloインストールしようとしたら、嵌りました。。。

下記作業メモです。

環境

CentOS 6.5

インストール後
Ruby 2.3.3
gem 2.6.12
knife-solo (0.7.0.pre)

chefのインストー

# curl -L http://www.opscode.com/chef/install.sh | sudo bash

knifeの初期設定

# knife configure

rubygemをインストー

# yum install gcc git rubygems ruby-devel

通常インストールされるruby1.8.7だとknife-soloがインストールできない為、rubyを2.3.3にアップグレードします。
その為に、rubyのバージョンを簡単に切り替えられるrbenvをインストールします。

下記を参考にしました。
http://www.task-notes.com/entry/20150624/1435114800

# git clone git://github.com/sstephenson/rbenv.git /usr/local/src/rbenv

# echo 'export RBENV_ROOT="/usr/local/src/rbenv"' >> /etc/profile.d/rbenv.sh

# echo 'export PATH="${RBENV_ROOT}/bin:${PATH}"' >> /etc/profile.d/rbenv.sh

# echo 'eval "$(rbenv init -)"' >> /etc/profile.d/rbenv.sh

# source /etc/profile.d/rbenv.sh
# rbenv -v
rbenv 1.1.0-7-g755c820

「ohai」が2.3以上でないとエラーになる為下記2.3をインストールする

# rbenv install 2.3.4

# rbenv global 2.3.4

# ruby -v
ruby 2.3.4p301 (2017-03-30 revision 58214) [x86_64-linux]

# gem update --system
# gem -v
2.6.12

# gem install bundler


knife-soloをインスト―ル

# gem install knife-solo --pre

# knife -v
Chef: 13.1.31

# gem list | grep knife-solo
knife-solo (0.7.0.pre)

Jenkinsインストール - ジョブ実行までやってみる

自分の個人プロジェクトのCI環境を作ろうと思いJenkinsを試しています。

インストール・ジョブを試しに実行してみるところまでやってみました。

Jenkinsのインスト―ル
http://qiita.com/UmedaTakefumi/items/4a6f688a61e169759e44

# sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat-stable/jenkins.repo
# sudo rpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key
# yum install jenkins
# yum install wget java-1.7.0-openjdk
# service jenkins start
# chkconfig jenkins on

iptablesでポートを開放(デフォルト8080番利用)

# vi /etc/sysconfig/iptables
service iptables restart

Unlock Jenkinsと出てきたら、下記にパスワードがあるので
コピーして、パスワードを貼り付け

# cat /var/lib/jenkins/secrets/initialAdminPassword

http://ドメイン:8080でログインして
プラグインのインストール / ユーザ登録を行う
http://symfoware.blog68.fc2.com/blog-entry-1899.html

ジョブを試しに実行してみるところまでやってみました。
http://qiita.com/nyasba/items/eea459e97a56c5d43fce

twitterのoauthログイン

PHPで、twitterによるoauthログインを試しに実装してみた。
【PHP】新TwitterOAuthでログイン機能を実装する - Qiita

上記の通りに実装すれば簡単にできますが「abraham/twitteroauth」を
composerを使ってインストールした場合、requireするファイルを下記に書き換えます。

require_once 'vendor/autoload.php';

TwitterOAuth PHP Library for the Twitter REST API

Node.jsインストール~簡易チャット作成まで

Node.js面白そうだったので、試しでやってみる。

環境

サーバ:CentOS6.5
クライアント:Windows10

Nodeインストー

下記を参考にしました。

Node.js を5分で大雑把に理解する
http://qiita.com/hshimo/items/1ecb7ed1b567aacbe559

nvmでnode.jsをインストールすることで、バージョンを切り替え可能
http://arfyasu.hatenablog.com/entry/2016/01/26/212543

node 6.10を入れてみた。

# nvm install 6.10
# node -v
v6.10.3

Hello World

とりあえず、コピペで「Hello World」できた。
http://arfyasu.hatenablog.com/entry/2016/01/26/212543

iptablesで、ポートを開けます。
 いちいちぽート開けるのがメンドクサイ。。。

簡易チャット

socket.ioをインストー

# npm install socket.io

http://engineer.recruit-lifestyle.co.jp/techblog/2015-07-29-node4/

コピペして簡単なチャット作成まではできた。
リアルタイムで応答かえってくるの面白い。

f:id:bz0:20170517004905g:plain