読者です 読者をやめる 読者になる 読者になる

SIerからWebエンジニアに転職してみて思ったこと

まず強調して言いたいのが、エンジニア歴1年のクソ雑魚エンジニアが必死に頑張っているという前提で見てくださると幸いです。

前職のSIerから某Webサービス会社に転職してみて思ったこと、何が違うのか、今の自分の課題、個人としての今後の目標をこの記事で整理できればと思います。

前職はRubyエンジニアとして1年間在籍しました。 そこからどうしてもサービスの会社に行きたいと思い転職活動をした結果運よく1月から働けることになりました。 ちなみに前職の総社員数(アルバイト等含む)が20人くらい、転職先は50人くらい、サービスの規模はMAUで600万PVくらいのとこです。

今月から働いておりますが、毎日キャッチアップで必死です(特に膨大なソースコードの理解が....) レベル的にはチーム開発が最低限できるような初心者同然で、個人的にサービスとか作っていますが、今の会社のソースコードはちんぷんかんぷんに感じることがほとんどです...

エンジニアの中で圧倒的にできない私で、辛いことも多いですけど、周りの人はスーパーな人ばかりなので、指摘をもらうたびに感動で涙が出そうになります。 いまの私のフェーズで最も成長するにその組織で最下層にいることが重要なんだと実感しています。 同僚エンジニア同士の何気ない会話さえ、すごい勉強になるのでボイスレコーダーでとっておきたいです。

1日の流れ

  • チケットをこなす(実装) チケットの起案者(全社員)とこういう機能があったらいいよねみたいなコミュニケーションを交えつつサービスに反映していきます。

  • 毎日30分のフィードバック 今日は何をして何がわからなかったか、課題、改善策、改善結果、明日までの宿題(例えばRubyのHashクラスのメソッドを全部覚えてくるみたいな....)を毎日してもらっています...

  • 打ち合わせ、会議

だいたいこれであっという間に1日が終わります。退社時刻は平均で22時くらい

成長の実感

1月から働いて毎日があっという間で自分が成長している実感なんてまだわかりませんが、一つ言えるのがコミュニケーション能力が確実に上がった感があります。 これは自分の中で感動するレベルです。無意識に気づいたらこの人と話してるみたいなことが頻発しています。日常生活においてもふとした時に他人と話すことができるようになりました。 技術的にはコーディング以外に加えて、インフラ、ネットワーク的なことにも関わるので自然とわかってくるなーって感じです。

課題

サービス志向エンジニアになる! サービス系の会社でエンジニアでいる以上はサービスの成長に責任を持たなければなりません。毎日の面談で技術力つけたい主張をする私に対し上司は毎日サービスが良くなることが最重要なんだよと強く言い返されています。 もともとすごいサービスを作りたくてエンジニアになった私ですが、ここが一番の課題で難しいです。仮定があって、改善案を出すことはできますがその後の数字に責任を持つと考えると慎重にならざるを得ません....自分のサービスの時にはどうなってもいいやみたいな感覚ありましたが会社のサービスでそんなことできません。

所感

これは少し言い難く私の勝手な思い込みを言わせていただくと、エンジニアドリブンの会社が最強な気がしています(素晴らしくサービス志向できるという前提で)。どうしてもビジネスサイドとのコミュニケーションをしてるうちにスピード感が遅れてしまっているなと感じています。(disってるわけではなく理想を書いてるだけでビジネスサイドすごすぎです)

この会社での目標

  1. フルスタックのエンジニアになる
  2. サービス志向を極める

全然まとまっていませんが以上!!

deviseでのUser登録画面を他のテンプレートで使いたい時

$ rake routes

user_registration POST              /                                            devise/registrations#create #ここがuser登録のパス
new_user_registration GET        /sign_up(.:format)               devise/registrations#new
edit_user_registration GET        /profile(.:format)                 devise/registrations#edit
<%= form_for(:user, :url => registration_path(:user)) do |f| %>
  #省略

<% end %>

わざわざコントローラーでインスタンスを作ってとかしなくていいから楽ですね

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (38)

mysqlにアクセスできないエラーが出てハマったのでメモ

$ rails db
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (38)
$ sudo mysql.server start
Starting MySQL
. ERROR! The server quit without updating PID file (/usr/local/var/mysql/[自分のマシン名].local.pid).


$ ls -la /usr/local/var/mysql
total 221288
drwxr-xr-x   19 username  admin       646 12 15 18:31 .
drwxrwxr-x    6 username  admin       204 11 14 15:43 ..
-rw-r-----    1 _mysql           admin      9822 12 15 18:31 [自分のマシン名].local.err        # 所有権が1_mysqlとなっているのでここを自分にする必要がある

$ sudo chown username /usr/local/var/mysql/[自分のマシン名].local.err # 権限変更コマンド

$ mysql.server start
Starting MySQL
. SUCCESS!

そのあと $ rake db:create で治りましたー

カラムをinteger型に変えたところPG::DatatypeMismatch: ERRORが出た

$ rake db:migrateしたら以下のエラーが出ました

PG::DatatypeMismatch: ERROR:  column "hoge" cannot be cast automatically to type integer
HINT:  You might need to specify "USING hoge::integer".
class ChangeTagInTask < ActiveRecord::Migration
  def change
    # change_column :tasks, :hoge, :integer となっていたところを以下のように修正
    change_column :tasks, :hoge, 'integer USING CAST(hoge AS integer)' # 修正箇所
  end
end```


これで治ります。

Postgres 勉強メモ

  • 構造1-ファイル群-
<PGDATA>
-PG_VERSION …PostgreSQLのバージョンを示したファイル
-base …各データベースのデータ本体用のディレクトリ
-global …データベースクラスタ共通用のディレクトリ
-pg_clog …コミットログ格納用のディレクトリ
-pg_hba.conf …HostBase認証用の設定ファイル
-pg_ident.conf …ident認証用の設定ファイル
-pg_log …サーバログファイル格納用ディレクトリ
-pg_multixact …マルチトランザクション管理用ディレクトリ
-pg_notify …Listen/Notifyコマンド用ディレクトリ
-pg_serial …シリアル型の管理用ディレクトリ
-pg_stat_tmp …統計情報の一時ファイル用ディレクトリ
-pg_subtrans …サブトランザクション用ディレクトリ
-pg_tblspc …テーブルスペースに関するデータ
-pg_twophase …2相コミット利用時のデータ
-pg_xlog …トランザクションログ
-postgresql.conf …PostgreSQLの設定ファイル
-postmaster.pid …現在のpostmasterのプロセスID等を記述したファイル
-postmaster.opts …PostgreSQLの起動オプションを示したファイル

構造2 -メモリ群 -

- shared_buffers(共有メモリ)
   -> データの読込み、書込みに使用されるメモリ領域。
- wal_buffers(WALバッファ)
   -> WALログの書込みに使用されるメモリ領域。
- work_memory(作業領域)
   -> ソート処理、ハッシュ作成処理、結合に使われるメモリ領域
で、実行プロセス毎に確保される。
- maintenance_work_memory(メンテナンス領域)
   -> VACUUMやインデックス作成に使われるメモリ領域で、実
行プロセス毎に確保される。

構造3 -プロセス-

- postmaster(リスナプロセス)
    クライアントからの接続を受付け、認証処理を行う。
    起動時にサーバプロセス以外の各プロセスを生成する(fork)。
    認証されたクライアントに対して、postgresプロセスを生成し(fork)、
処理を引き渡す。
- postgres(サーバプロセス)
    個々のクライアントの要求を処理するプロセス。
- writer(バックグラウンドライタ)
    共有バッファのデータをテーブルファイル、インデックスファイルに書
込む。
- wal_writer(WALライタ)
     WALバッファのデータをトランザクションログファイルに書込む。
- archiver(WALアーカイバ)
     WALログファイルをPITRのためにアーカイバに移動する。
- checkpointer(チェックポインタ)
     全てのダーティページをデータファイルに書出す。

各種設定方法

  • postgresql.conf -> Postgresqlのパラメータ設定
  • pg_hba.conf -> クライアント認証関連の設定

接続と認証

  • listen_address -> クライアントからの接続を監視するIPアドレスを指定
  • port -> サーバーが監視するTCPポート

クライアント接続デフォルト

パフォーマンスチューニング関連の設定

  • shared_buffers -> 共有メモリの使用するメモリ量
  • work_mem -> 内部そーと、ハッシュテーブル操作で使用するメモリ量 *maintenance_work_mem -> VACUUM等の保守操作で使用するメモリ量
  • bgwriter_delay -> バックグラウンドライタの動作周期

運用管理

運用管理にはデータベースの追加・削除・変更、 データベースの各種情報取得、テーブル単位の権 限の付与・取消など色々あるが、PostgreSQL独特であるVACUUM(+ANALYZE)について注視する。 ####なぜvacuumが必要か?   -> PostgreSQLのデータ管理が追記型だか ら、不要領域を回収する必要があるため。

f:id:snsn19910803:20161125151817p:plain

f:id:snsn19910803:20161125151823p:plain

ファイル追記型にはメリットもあるが、何もしな いとファイルサイズが肥大化し続けてしまうため、 不要領域のメンテナンスが必要 ⇒運用管理としてVACUUMが必要

f:id:snsn19910803:20161125151924p:plain

f:id:snsn19910803:20161125151955p:plain

pg_dumpによるバックアップ

###バックアップコマンド
 *pg_dumpコマンド
      - データベースを指定してバックアップする。
 *pg_dumpall
      -  全てのデータベース、データベースクラスタ全体をバック
アップする。

###リストアコマンド
*テキスト形式の場合
      - psqlコマンド
*バイナリ形式の場合
      - pg_restoreコマンド

他にも osコマンドとPITRによるバックアップが可能なので今度勉強する

実行計画の取得

* SQL文を実際に実行せずに、推測で取得する方法
     - SQL文の前に、「EXPLAIN」を付与

* SQL文を実際に実行して、実行結果の情報も併せて取得する方法
    - SQL文の前に、「EXPLAIN ANALYSE」を付与
    - INSERT、UPDATE、DELETE等を実行すると実データに影響を与えるため注意

f:id:snsn19910803:20161125152623p:plainf:id:snsn19910803:20161125152627p:plain

便利なunixコマンドまとめ

オライリーの入門unix を読んでみて、便利と思ったコマンドのメモ。

$ ls -a   ファイルの一覧( aオプションで隠しフォルダも表示)

.DS_Store               .ssh
.Trash                  .subversion
.atom                   Applications
.bash_history               Desktop
.bash_profile
$ ls -al ( lオプションを追加することで、詳細情報も表示可能)

total 96
drwxr-xr-x+ 32 user  staff   1088 11 21 17:10 .
drwxr-xr-x   5 root             admin    170 11 20 12:51 ..
-r--------   1 user  staff      7 11 14 14:43 .CFUserTextEncoding
-rw-r--r--@  1 user staff  14340 11 22 16:15 .DS_Store
drwx------   2 user  staff     68 11 20 20:56 .Trash
drwxr-xr-x  15 user  staff    510 11 19 10:13 .atom
・・・

ワイルドカード

「?」は任意の1文字に一致する. 例えば 「h?p」ならhop, hip, hap等で一致する。しかし、hpやhelpには一致しない。

$ ls file?.rb

file1.rb file1.rb file3.rb file4.rb file5.rb file6.rb と返してくれる
 

「*(アスタリスク記号)」はどんな文字の並びにも一致する

$ ls file[4-6]*

この場合 . 以降が*で表されるため file4.rb file5.rb file6.rbと帰ってくる

ファイル内容の閲覧

ターミナルでファイルの中身を確認したいときはcatを使っていたが、分量が長いファイルを参照したいときにはlessを使うとスクロールができるため便利。

ファイル内の文字を置き換えるtrコマンド

$ cat todo.txt

1. Wake up
2. eat food
3. read newspaper

$ tr '[aiueo]' '[xxxxx]' < todo.txt

1. Wxkx xp
2. xxt fxxd
3. rxxd nxwspxpxr

[aiueo] の部分を[xxxxx]として置き換えている!


小文字を大文字に変えることも可能!

$ tr  "[:lower:]" "[:upper:]" < todo.txt

1. WXKT XP
2. XXT FXXD
3. RXXD NXWSPXPXPXR

grep

ファイルや標準入力から正規表現でマッチする行を探し出すコマンド。

$ ls

.                   .python_history
..                  .rbenv
.CFUserTextEncoding         .ssh
.DS_Store               .subversion
.Trash                  .viminfo
.atom                   Applications
.bash_history               Desktop
.bash_profile               Documents
.bash_profile.pysave    Downloads
.bundle                 Library
.cache                  Movies
.codeintel              Music
.config                 Pictures
.gem                    Public
.gitconfig              
.local                  iCloud Drive(アーカイブ)
.netrc


grepで"D"にマッチするものでフィルタリング
$ ls -a | grep "D"
.DS_Store
Desktop
Documents
Downloads
iCloud Drive(アーカイブ)

grepうまく使いこなしたいです....

コマンド使いこなして生産性あげていきたいです.... 2017年の目標はvimを使いこなせるようになる!

javascriptの第一歩

今までrailsで写経したjsは使ったことあるのですが、昨日初めて自分で0からjs書いたので備忘録。

今回はviewに直書きしました イメージはフォームに西暦を入れて異なるフォームに移った時に現在の西暦からフォームに書いた西暦の引き算イベントが発生するものです。 例えば、text_fieldに2011と入力してフォームから離れると2016 - 2011が実行され5がviewに表示されるというものです。

hoge.html.slim

= form_for @company_setting, :url => { action: :update }, :method => :put do |f|
  h3.title.is-bold = t('.financial_period')


  br
    = f.text_field :closing_first_year, id: 'first_year'   #ここがイベント着火元

    span#calclation # このidに結果が表示される

javascript:
  // 決算1期目の年を入力して 他のフォームに移動すると今期が何期目なのか自動計算される
  $('#first_year').change(function() {
    var now        = new Date();
    var year       = now.getFullYear();
    var first_year = $('#first_year').val();

    if ($.isNumeric($('#first_year').val())) {
      $('#calclation').text(year - first_year);
    } else {
      $('#calclation').text('取得できません');  #半角数字以外の値を受け取った場合はelseを実行
    }
  });
  • 未入力状態 f:id:snsn19910803:20160916153729p:plain

  • 半角の数字を入力した時 f:id:snsn19910803:20160916153744p:plain

  • 半角数字以外 f:id:snsn19910803:20160916153752p:plain

ちなみに

var first_year = document.getElementById('first_year').value;

var first_year = $('#first_year').val();

は同じ意味とのこと!後者の方が簡潔に書けるので良い!

これだけ!!

なお今回はviewファイルで直にjsを書いたが、 例えばapp/assets/javascripts/hoge.jsを作ってそこに書いていくと viewに

= javascript_include_tag "hoge"

って書けばhoge.jsが使われるので、汎用的なものは個別にjsファイルとして作って書いていった方がいいとのこと。