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

株式会社クイックのWebサービス開発blog

HAPPYなエンジニア&デザイナーのブログです

新人エンジニア研修の失敗談

はじめまして。新卒入社1年目のみっきーです。

初投稿は、クイックの新人エンジニア研修についてお送りしたいと思います。
研修項目は下記2点を抜粋してお送りしたいと思います。

お送りする研修項目はこちら

  1. LPIC-level1を取得する
  2. 図書管理システム

私の研修は失敗続きで、やっていけるのかなーと悩む日々でした。
ですが、失敗から学べることが多く、くじけてないで何がだめだったのか考えようと、すぐ切り替えられるようになりました。
これから、あるいは現在なにか失敗して悩んでいる方がいれば、ぜひ下記の失敗談を読んでください。
こんなに失敗してても頑張っているんだなと、前向きになる切っ掛けになれたら幸いです。

LPIC-level1を取得する

LPIC-level1とは、2つの試験に合格することで取得できるLinuxの資格です。
LPI-Japan公式サイト参照
http://www.lpi.or.jp/

まず結果からお伝えすると、101試験を3回、102試験を1回の計4回受験し取得することができました。

スコア

101試験:580/800点 102試験:700/800点。

各試験の勉強時間

101試験 約3ヶ月
102試験 約2週間

感想

勉強時間とテスト結果が比例しない結果になりました。
直接的な原因としては、下記の2点だと思います。

  • 101試験は、古いテキストを使用して学習を行っていたため
  • 102試験は、新しいテキストを使用して学習をおこなったため

(黒本以外、使用してはならないと、固定概念に囚われていたため古いテキストを使用していました。馬鹿すぎる。うぅ。)
また個人の感覚としては、101試験はコマンド自体を覚えるものだったので、実際にLinuxをいじりながら学ばないと、覚えづらい試験だったかなと思います。
逆に102試験はLinuxの概念などが出題される試験で、101試験でコマンドを覚えてから学習を始めたため、覚えやすかったかなと思います。
受験期間は、恥ずかしいのと自分の学習能力の低さと、社費もったいないなとグルグル考えていてテンションだだ下がりでした。

勉強方法
基本的には問題をひたすら解いて暗記ー>実際にコマンドを打ってみるを繰り返しました。

教科書は下記を使用しました。


※古い本は割愛
白本は1問1解形式の教科書で、非常に好みでした。
豆本は、章ごとにまるっと復習したいときに便利な教科書でした。

また、101試験に関してはping-tにお世話になりました。
ping-tはドリル形式の問題出題サイトで、試験に向けて自信付けに役立つと思います。
また、正答率が上がっていくのが、ゲーム感覚で楽しかったです!

業務で役立つものを開発する

目的

企画、開発、運用を通して、気づきを得る(たぶん)


概要

図書管理システム

図書の検索、貸出、返却、登録がブラウザでできる仕組み(図書館のシステムのようなもの)をPC/SP版で作成。

  • PC版では、表紙を一覧表示することで、図書を直感的に選ぶことができる仕組み
  • SP版では、貸出、返却、登録が、書籍のISBNコードをカメラで読み取るだけで、簡単に行える仕組み


失敗したこと(多数ありますが、クリティカルなものを抜粋)

  • スケジュール

バッファを取らずに作成し、リスケを繰り返す

  • テスト

テストリストを作成せずに、セルフテストや開発、修正を行ったため、最終テスト依頼時に、動かないトラブル発生

  • 技術調査

サーバ周りの知識が足りず、リリースができない

  • 手書きの設計書

ミーティング時見づらく、修正した箇所がわかりづらい

  • 誤操作によるデータ削除

頭の回っていないときに、GUIで変更作業をしていたら、誤ってデータを削除


失敗から学んだこと・改善できたこと

  • スケジュール作成方法

途中からスケジュールの管理ができるようになりました。
スケジュールの管理ができると仕事が捗っている気がして楽しかったです!
また、心身ともに負担が少ないので余裕が出て周りが少しは見れるようになった気がします。

  • テスト方法

テストリストを作成。
それをもとにセルフテストを行ったため、大きな問題なく、比較的スムーズにテストをクリアすることができました。
  

  • 設計書の作成方法

データで作成し、印刷して共有するよう変更しました。
結果、見やすく、変更しやすく、変更箇所がわかりやすい資料が作成できました。
自分も、共有相手も便利になりました。
以後こちらで行います。。。(最初からやれよって感じですね)

  • 誤操作によるデータ削除

データをいじるときは、手順を作成し、間違いが起きないか確認後を行うことにしました。
今のうちにGUIでポイポイいじって、恐怖体験ができてよかったです。

感想
上記以外にも研修を通して、失敗を経験することができました。
そこから多くのことを学ぶことができたと思います。
ですが、まだまだ気づけていないことがあるので、これからも振り返りを行いたいと思います。

現在の目標
日本語力が低く、OJTの方に文章の添削をしていただいています。
簡潔で伝わるビジネス文章を書けるよう日々訓練しております。
と、いうことで現在の目標は!
正しい日本語を使用できるようにする★
ですー!

駄文失礼しました。
ここまで読んでくださりありがとうございます。
これからも頑張ります。

Emacsで、JavaScriptとJSONのインデント幅をスペース2個にした

こんにちは。今月から、本格的にVimからEmacsに改宗した五所です。

Emacsよいですよ。変態的なキーバインドが慣れると気持ちよいです。

私が使っているHappy Hacking Keyboardとの相性もバツグンです。なにせAltキーを手のひらで押せますからね。

JSONのインデント

私の使っている環境(GNU Emacs 25.1.1 / Arch Linux)では、javascript-modeのデフォルトのインデントはスペース4個となっています。

私は、JavaScriptのインデントはスペース2個でずっとやってきましたので、違和感を感じました。

しかし、天下のEmacsがスペース4個って言っているならもしかしてそうなんじゃないか、と思ったので適当に有名どころを調べました。

MEAN Stack

https://github.com/linnovate/mean

スペース2個です。

package.json

https://github.com/linnovate/mean/blob/master/package.json

スペース2個です。

composer.json

https://github.com/laravel/laravel/blob/master/composer.json

なんとスペース4個です。

PHP界では、JavaScriptはスペース4個なんですね。

ということは、コーディングしている言語に合わせてよいということか。

結論

書いているのがRubyだったので、インデントは2個にしました。

下記のLispコードを~/.emacs.d/init.elに追加しました。

(add-hook 'js-mode-hook
          (lambda ()
            (make-local-variable 'js-indent-level)
            (setq js-indent-level 2)))

参考

http://stackoverflow.com/questions/17901900/how-can-i-set-a-tab-width-for-json-files

おまけ

.editorconfigも後で設定しないとだなー

MySQLをメモリ(tmpfs)にして、3倍速くした話

弊社ではXenServerを使用してますが、結構メモリが余ってる事に気付き
MySQLをメモリ上(tmpfs)に置いて爆速にしてやろう、と思いつきました。
インメモリよりオンメモリMySQLを実現させます。

雨はくせっ毛の敵、よって雨は敵。
matsBです。

HDDよりメモリの方が何をどう考えても速いのですが、メモリ特有の懸念点があります。
メモリ上に置くのでサーバ自体が再起動した時に、データが全て無くなるってところです。
リードレプリカなどで実践したほうが無難な運用になるかと思いますが、そんなのかんけーねー!
って方は、是非本番で試して下さい(๑•̀ㅂ•́)و✧

環境

CentOS 6.5
MySQL 5.6
メモリ 20GB

前提

rsyncをインストール
実データより、メモリが大きい
ここから下のコマンド類はrootで実行しています

下準備

メモリ(tmpfs)をマウント

$ mkdir /mnt/ramdisk/
$ mount -t tmpfs -o size=12G  tmpfs /mnt/ramdisk/

MySQL用のディレクトリを作成

$ mkdir /mnt/ramdisk/mysql
$ mkdir /mnt/ramdisk/tmp
$ chown mysql: /mnt/ramdisk/mysql
$ chown mysql: /mnt/ramdisk/tmp



MySQLの移動

MySQLをストップ

$ /etc/init.d/mysqld stop

MySQLの実データを移行

$ /usr/bin/rsync -avz --delete /var/lib/mysql/ /mnt/ramdisk/mysql/

MySQLのmy.cnfの書き換え

$ vim /etc/my.cnf
[mysqld]
datadir = /mnt/ramdisk/mysql    # データディレクトリをtmpfsに指定
tmpdir = /mnt/ramdisk/tmp     # tmpディレクトリをtmpfsに指定

MySQLをスタート

$ /etc/init.d/mysqld start


とりあえずこれでメモリ上でMySQLが動いて、SQL文を流してみると早さを実感できます。
ここから、再起動してもデータが消えないようにする作業をしていきます。


後処理

シャットダウン時にメモリ上からHDD上にデータを移行

$ vim /etc/rc.d/init.d/halt
/usr/bin/rsync -avz --delete /mnt/ramdisk/mysql/ /var/lib/mysql/

起動時にMySQLがメモリ上(tmpfs)で起動するように追記

$ vim /etc/rc.local
mount -t tmpfs -o size=12G  tmpfs /mnt/ramdisk/
mkdir /mnt/ramdisk/mysql
mkdir /mnt/ramdisk/tmp
chown mysql:mysql /mnt/ramdisk/mysql
chown mysql:mysql /mnt/ramdisk/tmp
/usr/bin/rsync -avz --delete /var/lib/mysql/ /mnt/ramdisk/mysql/
/etc/init.d/mysqld start1

これで、「shutdown -h now」や「reboot」コマンドでサーバを停止しても、シャットダウン時にHDDにデータが移動して起動時にメモリにデータが移動するようになります。




※1
rc.localでmysqldを起動させているのは、デフォルトのまま自動起動にするとrc.localよりもmysqldの方が早く起動します。
となると、メモリをマウントするに起動してしまうため必ず起動に失敗します。
rc.localの起動順をmysqldより前に変更してしまえばいいじゃん!って思いましたが、/etc/rc3.d/ 内でのrc.local起動順番は「S99local」となっており、最後に起動することを想定しています。

$ ls -l /etc/rc3.d/
~中略~
lrwxrwxrwx. 1 root root 16  421 16:58 2016 S64mysqld -> ../init.d/mysqld
lrwxrwxrwx 1 root root 11  319  2015 S99local -> ../rc.local

別の誰かがrc.localに書くときは起動の最後に動くことを想定するはずなので、起動順を変えずにrc.localでmysqldを起動させてます。

DockerのPull Requestのテンプレートが面白い

こんにちは、五所です。

GitHubを漁るのが好きで、色々なプロジェクトやコードを見ている過程で見つけた小ネタです。

URLはこちら。

github.com

テンプレートは

docker/.github/PULL_REQUEST_TEMPLATE.md

- What I did
- How I did it

...略...

- A picture of a cute animal (not mandatory but encouraged)

とあり、かわいい動物の写真をPull Requestに添付している人もいるようです。

例えば、このプルリクエストでは猫の写真が添付されています。癒やされますね。

github.com

こんな遊び心を持って、仕事していきたいですね。

おまけ

Docker良いですよね。仮想化されてるのに起動が爆速です。最近弊社でも一部で導入しています。

個人的には、開発環境を可能な限りDockerで構築することにしています。

【Windows】管理者権限への昇格(RunasでVBS)

初めまして。シスアド担当のスカイ(甘党)です。

さっそくですが「あるあるPC管理者の悩み」を中心に書いていこうと思います。
そんなわけで今回あるあるPC管理者ネタはVBScript
「管理者権限がないユーザーにも管理者権限が必要なソフトをインストールさせたい!①」です。

今回のネタはソフト配信ツール等が配備されている企業なら全然悩むことないと思うんだけど、
「そんなに頻度もないし導入するほうが手間だ」とか
「でもお高いんでしょ?」とかとか
マンパワーでなんとかならないの?」とかあるあるじゃないでしょうか。

こんな時は(楽するためにも)PC管理者大好きVBScriptの出番ですね。

管理者権限で実行するには色々な方法がありますが、
コマンドプロンプトを管理者として実行する」方法が簡単なのでご紹介します。

今回はShellのRunasコマンドとSendkeysメソッドを利用してみます。

豆知識としてRunasコマンドはVISTAから利用できまして、
現在のログオンユーザとは別のユーザーでのアクセス許可する事ができます。豆知識終了。

動作確認環境はWindows7Pro_32bit、64bit(どちらもドメイン参加済)

他の前提条件としては
 ・ドメインまたはローカル管理者の権限がPCにある事。
 ・VBSを実行できる事。(グループポリシー等により制限がある場合はできません;;)

Set WshShell = CreateObject("Wscript.Shell")
'ローカルユーザの場合はドメイン名のとこ記載不要です。
Return = WshShell.Run("runas /user:『ドメイン名\ユーザー名』 cmd.exe")
WScript.Sleep 1000
WshShell.AppActivate "runas.exe"
WScript.Sleep 1000
'パスワードは上記に記載したユーザーのパスワードを入れて下さい。
WshShell.SendKeys "『パスワード』"
WScript.Sleep 1000
WshShell.SendKeys "{enter}"
WScript.Sleep 1000
WshShell.AppActivate "cmd"
WScript.Sleep 1000
'インストールするファイルのパス(例)c:\test\test.exe
WshShell.SendKeys "『インストールしたいexeのパス』"
WScript.Sleep 1000
WshShell.SendKeys "{enter}"


やったーこれで色々できちゃうぞーーーと喜ばれた方に悲報です。

「あれ?コマンドプロンプト画面実行中にメモ帳とか開くとPASSがゲットできるぞ!?」

そうなのです。最初に申し上げてなかったのですが私の作成したVBSは実行したら終了まで何も操作しないで!って仕様なのです…
exe以外でも利用できるので有用といえば有用なのですけどね!


なので今回の「管理者権限がないユーザーにも管理者権限が必要なソフトをインストールさせたい!①」はお蔵入りに、あるある!!

次回「管理者権限がないユーザーにも管理者権限が必要なソフトをインストールさせたい!②」に続きます。あるある!!

「精神と時の部屋」コマンドを作った

こんにちは。五所です。

ちょっとしたプログラムの動作確認をテストするために、一時的なファイルやディレクトリを作成することがある。

今までは、

mkdir /tmp/a
cd /tmp/a

とかやっていたのだが、個人的に/tmp/aはけっこう使うので重なることがあるし、何度もコマンドを打つのが面倒。何よりやってることがダサい。

そこで、下記のエイリアスを作成した。

alias seishin-to-tokinoheya='cd $(mktemp -d)'

使い方はこんな感じ。

[kazuya@kazuya-ubuntu:~] % pwd    
/home/kazuya
[kazuya@kazuya-ubuntu:~] % seishin-to-tokinoheya 
[kazuya@kazuya-ubuntu:/tmp/tmp.92XUQmoHND]% pwd
/tmp/tmp.92XUQmoHND

seishin<TAB>で補完できるので打ちやすい。けっこう気に入った。

Gitで特定のコミットへrevertする方法

Gitで、あるコミットまでロールバックする方法が知りたかったので調べた。

結論

これでいいらしい。

# Reset the index and working tree to the desired tree
# Ensure you have no uncommitted changes that you want to keep
git reset --hard 56e05fced

# Move the branch pointer back to the previous HEAD
git reset --soft HEAD@{1}

git commit -m "Revert to 56e05fced"

参考:

Revert to a commit by a SHA hash in Git? - Stack Overflow

試したこと

真っ先に調べたのが

git revert 56e05fced

ですが、これは56e05fcedを取り消すという意味なので、今回やりたいこととは違います。

次に、よく検索で引っかかるのが、

git reset --hard 56e05fced
git push -f origin master

という方法。

単にgit push origin masterだと、先にgit pullしてと怒られる。まあresetしているので当然ですが。

GitHubで、masterブランチをprotectしていると使えないので、これはやりません。

ロールバック時だけprotectを外すという奥の手も考えましたが、そうするとproctectしている意味がないですよね・・・。副作用ありそうですし。

こちらの方法もよく引っかかります。

git checkout 56e05fced

確かにこれ、一時的に現在あるファイルは56e05fcedになるんですが、それをorigin/masterに反映できないんですよね。

git checkout -b rollback-56e05fced
git push origin rollback-56e05fced

とかやって、GitHub上でrollback-56e05fced => masterへのPull Request送っても、何も変更してないよって言われるだけです。まあ、これも当然ですが・・・。

一瞬、

git checkout 56e05fced
mkdir /tmp/my-project
cp -r . /tmp/my-project
git checkout master
cp -r /tmp/my-project/* .

が頭をよぎりましたが、さすがにダサすぎるのでやめました。

ならば、origin/masterにいながらファイルを変更すれば?と思い、次を試しました。

git checkout 56e05fced .
git add -A .
git commit -m 'Rollback to 56e05fced'

残念ながら、これは新しく追加されたファイルには適用できないみたいで、駄目でした。

結局、「git revert to a commit」でググり、結論にたどり着きました。

おまけ

弊社では、Gitに詳しいエンジニアを募集しています。

https://www.green-japan.com/job/40769

よろしければ、ご覧ください。