Quantcast
Channel: 初心者タグが付けられた新着記事 - Qiita
Viewing all 21655 articles
Browse latest View live

IT企業でよく使われる横文字をまとめてみた

$
0
0

はじめまして

ここ最近、転職をしましてエンジニアらしくプログラミング等々をお勉強しております。前職でDB少しいじって、転職後はSpringを学んでたんですけど、ここに来て急遽Swiftをやることになりました。文法はもとよりXcodeを使いこなさないと…

今後は、自分の備忘録も兼ねて記事を残して行こうと思いますが、最初はとりあえずQiitaに投稿することを目的に自分の書きたいことを記事にしてみました。

ターゲットとなる読者

  • IT企業への入社を考えている方
  • これからIT企業に入社する方
  • 直近でIT企業に入社した方

そもそも横文字ってなに?

所謂、カタカナ語のことです。
その中でも、ビジネスシーンで使われるカタカナ語のことを「横文字」と言っているような気がします。(あくまで個人の見解ですが。。。)
横文字が得意な人、苦手な人、好きな人、嫌いな人といろんな方がいらっしゃると思いますが、IT企業で働く上で頻出の横文字を興味本位でまとめてみましたのでご覧ください。

【超頻出】IT企業で使われる横文字

アサイン

意味

仕事を割り当てる、任命するという意味

使用例

Aさんを〇〇のプロジェクトにアサインする
(Aさんをプロジェクトに割り当てる)

エビデンス

意味

証拠。IT企業で使われるエビデンスとは、主にシステムテストなどの際にスクショした画面のキャプチャのこと。テスト結果とテストの完遂を担保する証拠として画面キャプチャを取得することが多い。

使用例

「エビデンス取得しておいて!」
(「テストの時の画面キャプチャ取っといて!」)

タスク

意味

仕事。作業。自分やチームがやるべき仕事

使用例

「タスク管理できてる?」
(「自分のやるべき作業の管理できてる?」)

【頻出】IT企業で使われる横文字

サマリー

意味

要約、概要という意味。文量の多いドキュメントをまとめるときとか会議の時によく使われる。

使用例

「このドキュメント、お客様のところ持ってくからサマリー作ってもらえる?」
(「このドキュメント、お客様のところ持ってくから要約した文章作ってもらえる?」)

リスケ

意味

Reschedule(リスケジュール)の略称。つまり、スケジュールを変更する、計画を立て直すという意味。

使用例

「〇〇プロジェクトの進捗が遅れてるからリスケしないと」
(「〇〇プロジェクトの進捗が遅れてるからスケジュールを練り直さないと」)

デフォルト

意味

直訳すると、標準や基本という意味。IT企業では初期値や初期設定という意味で広く使われる。

使用例

システムをデフォルトのまま使う
(システムを標準の初期設定から変更せずに使う)

リソース

意味

直訳すると資源という意味を持つがIT企業では様々な使い方をする。

  1. 人手、人材という意味。プロジェクトにアサインすることのできる要員

  2. サイトやシステムで使うためのファイルや画像のこと。

  3. PCのCPU性能やメモリ、ディスクの容量のこと

使用例(1の例を)

慢性的なリソース不足
(慢性的な人手不足)

アラート

意味

直訳すると警報という意味。使われ方としては、プロジェクトが納期に間に合わなそうな時とかに、助けを求めたり、上に報告するときによく出てくる。

使用例

ヤバイなと思った時は早めにアラートあげてね
(ヤバイなと思った時は早めに悪い状況を報告してね。)

【よく聞く】IT企業で使われる横文字

バッファ

意味

IT企業では主に2つの意味で使われる。

  1. 時間的なゆとり、期限までの余裕という意味

  2. データを一時的に保存しておく領域のこと

使用例(1の例を)

バッファを持たせて計画を立てる
時間的なゆとりを持って計画を立てる

スクラッチ

意味

ゼロから。最初からなどという意味。IT企業ではスクラッチ開発というワードで使われる。スクラッチ開発とは、パッケージや既存のものを使わずにゼロからシステム開発をすること。ゼロベース開発とも言う。

使用例

今回のプロジェクトはスクラッチ開発にする
(今回のプロジェクトはゼロから開発して作る)

エンハンス

意味

高める、促進するという意味。IT企業ではエンハンス開発というワードで使われる。エンハンス開発とは、既存のシステムに対して追加機能を使ったり、性能の改善を行うこと。機能追加とか改修と同じ意味。

使用例

エンハンスの案件が獲れた
(追加機能作成[あるいは改修]の案件が獲れた)

おわりに

とまあ、ざっくりこんな感じ。いやもっとある、はず。。。
というわけなので、時間があるときにコレと思うのがあったら追加しようと思う。

ちなみにタイト、アウトプット、ソリューションとかは会社以外でもよく聞く一般的な横文字なので割愛しましたー。


ローカルリポジトリとリモートリポジトリをリンクさせる

$
0
0

目的

  • ローカルリポジトリとリモートリポジトリをリンクさせる方法をまとめる

実施方法

  1. ローカルリポジトリの.gitフォルダが見えるディレクトリ階層で下記コマンドを実行する。

    $git remote add origin "リモートリポジトリのURL"
  2. 同階層で下記コマンドを実行してリンクされたリモートリポジトリのURLを確認する。

    $git remote -v>origin  リモートリポジトリのURL.git (fetch)>origin  リモートリポジトリのURL.git (push)

宿題がめんどくさかったのでPythonで管理会計をする

$
0
0

私は大学では経営学を学んでいるのでもちろん会計的な授業もあります。その中の一つである管理会計の授業の問題がめんどくさいのでプログラミングでできないかなと考えました。テストの時には使えないので結局計算式は暗記しないといけないのですが、まぁ今回はいいでしょう。

管理会計とは?

管理会計(かんりかいけい、英語:management accounting)は、企業会計の一種。主として、会計情報を経営管理者の意思決定や組織内部の業績測定・業績評価に役立てることを目的としている。対義語は財務会計である。企業外部の利害関係者に対する情報提供を目的とする財務会計とは、大きく性格が異なっている。

引用 wikipedia

簡単にいうと一般的な簿記試験などである商業簿記などの会計は企業の外部の人にむけて作られているものなんです。なので規則に乗っ取って作らないといけません。しかし、管理会計の目的は企業の意思決定に役に立つ様な会計的な情報を測定し、レポートを作成することなので目的が全く違うのです。

投資可能(受託可能)な案件かどうか判定する

nowは現在の生産量
capacity_percentは現在の操業度
trade_request_amountは相手の求めている生産量

defInvestable(now,capacity_percent,trade_request_amount):max_amount=now/capacity_percentnow_can_use=max_amount-nowifnow_can_use>trade_request_amount:print('Investable')else:print('No')Investable(42500,85,7000)#実行結果
No

実行の結果この投資案は実行できないということが分かりました。

差額原価収益分析

差額原価収益分析とは、安値受注のような特殊な非反復的意思決定を行うときに、追加的に発生する収益及び原価・費用のみを抽出して差額利益を計算し、迅速な意思決定を行う手法である。

productive_volume  生産個数
revenue_per_item  製品1個あたりの利益
produce_cost_per_item 製品1個あたりの生産コスト  
sales_cost   販売費
fixed_cost  固定費

defDifferential_cost_revenue(productive_volume,revenue_per_item,produce_cost_per_item,sales_cost,fixed_cost):a=revenue_per_item*productive_volumeb=produce_cost_per_item*productive_volumec=sales_cost*productive_volumecost=b+c+fixed_costifa-cost>0:print('think voting')return(a-cost)else:print('stop voting')Differential_cost_revenue(6500,450,230,30,435000)#実行結果
thinkvoting800000

まとめ

今回は大学の授業の管理会計の宿題を簡単にやってくれるプログラムを作って見ました。このコードを書いたときは手元に問題のプリントがあったのですが、今はないので細かい問題の条件を忘れてしまいましたがコードが残っていたので想像でコードを書いて見ました笑

クラスメソッド、インスタンスメソッド。いつ使うのか。

$
0
0

まだエンジニアとして働く前、ちょうどRubyの勉強を始めた時に書いた「メソッドとクラスメソッドとインスタンスメソッドが曖昧だった」という記事があります。
この記事ですが、すでに1年半ほどが経過しているにも関わらず現在もいいねが押されており、初学者の助けになっているのであれば嬉しい限りです。
しかし、読み返してみるとこの記事は概念を説明しているだけで実際にどのように使えばよいのかは記述されておらず、腑に落ちないところがあるのかなと思いました。
そこで、今回はできる限り実例を交えて解説していきたいと思います。

いきなりですが、あなたは校長先生になります。

あなたにはいまから校長先生になっていただきます。生徒が入学してくるため、入学した生徒の管理をRubyで行ってください。

クラスを作る

まずはクラスを作成しましょう。クラス名は1年1組で、担当教師は山中先生です。

最初は最低限の機能
classClassdefinitialize(teachername,grade,group)# gradeは学年、groupは組@teachername=teachername@grade=grade@group=groupendendmy_class=Class.new("山中",1,1)

とりあえずクラスが1つできました。

生徒を入学させる(入学メソッド作成)

生徒を入学させていきます。入学する生徒の数は5人です。入学させるためにインスタンスメソッドを作成し、入学させましょう。

5名が入学
classClassdefinitialize(teachername,grade,group)@teachername=teachername@grade=grade@group=group# 名簿を作成@roster=[]enddefenter(name)# インスタンスメソッド@roster.pushnameendendmy_class=Class.new("山中",1,1)my_class.enter("平沢")my_class.enter("秋山")my_class.enter("田井中")my_class.enter("琴吹")my_class.enter("真鍋")

このように、作成したクラスに何かアクションを行いたい場合はインスタンスメソッドを使用します。

追加入学。そして名簿の出力

どうやら手違いがあったため、入学する生徒が5名追加となりました。
幸い、1年2組と森岡先生がいらっしゃいますのでクラスを追加しましょう。
また、クラス名簿を出力するメソッドも追加します。これはインスタンスメソッドでしょうか。クラスメソッドでしょうか。

クラス名簿を出力
classClassdefinitialize(teachername,grade,group)@teachername=teachername@grade=grade@group=group@roster=[]enddefenter(name)@roster.pushnameenddefprint_roster()# インスタンスメソッド?クラスメソッド?print@rosterendendyamanaka_class=Class.new("山中",1,1)yamanaka_class.enter("平沢")yamanaka_class.enter("秋山")yamanaka_class.enter("田井中")yamanaka_class.enter("琴吹")yamanaka_class.enter("真鍋")morioka_class=Class.new("森岡",1,2)morioka_class.enter("鳴宮")morioka_class.enter("竹早")morioka_class.enter("山之内")morioka_class.enter("如月")morioka_class.enter("小野木")yamanaka_class.print_roster()# > ["平沢", "秋山", "田井中", "琴吹", "真鍋"]morioka_class.print_roster()# > ["鳴宮", "竹早", "山之内", "如月", "小野木"]

クラス名簿=クラスごとの名簿を出力する。のでインスタンスメソッドになります。

全校生徒の人数を出力したい

いきなり生徒数が増えましたが、インスタンスメソッドを作成していたためコードの修正は軽微なものでしたね。
ただ、今後も急な転校などが発生する恐れがあります。また、今でこそ全校生徒は少ないですが、今後は増えていくかもしれません。
そうなると全校生徒の人数を把握するのが大変です。
そこで、クラスメソッドを使用して全校生徒数を出力してみましょう。

全校生徒に関わる処理追加
classClass# 全校生徒数をクラス変数で定義@@all_students_count=0defself.print_all_students_count# クラスメソッドで全校生徒数を出力するメソッド追加print"全校生徒は#{@@all_students_count}人です"enddefinitialize(teachername,grade,group)@teachername=teachername@grade=grade@group=group@roster=[]enddefenter(name)@roster.pushname# 入学したら全校生徒数を+1@@all_students_count+=1enddefprint_rosterprint@rosterendendClass.print_all_students_count# > 全校生徒は0人です# まだ入学者がいないため全校生徒は0人yamanaka_class=Class.new("山中",1,1)yamanaka_class.enter("平沢")yamanaka_class.enter("秋山")yamanaka_class.enter("田井中")yamanaka_class.enter("琴吹")yamanaka_class.enter("真鍋")Class.print_all_students_count# > 全校生徒は5人です# 山中先生のクラスに入学したため5人morioka_class=Class.new("森岡",1,2)morioka_class.enter("鳴宮")morioka_class.enter("竹早")morioka_class.enter("山之内")morioka_class.enter("如月")morioka_class.enter("小野木")yamanaka_class.print_roster()morioka_class.print_roster()Class.print_all_students_count# > 全校生徒は10人です# 森岡先生のクラスにも入学したため10人

まずはクラス変数で全校生徒数(@@all_students_count)を0で初期化しています。
そして、enterメソッドで入学後、全校生徒数に対して+1をするようにしました。これで入学者が増えると全校生徒数も増えていきます。
最後に、self.print_all_students_countのクラスメソッドを用意して全校生徒数を出力しています。
出力するタイミングを入学前、入学後、追加入学後に分けることによって挙動が確認できるかと思います。
このように、クラスメソッドは各クラス共通で使用できるメソッドであるといえます。

まとめ

インスタンスメソッド

  • インスタンス毎で挙動を制御したい場合に使用する
  • 今回だと入学はクラス(学級)ごとに行うためインスタンスメソッドとなる

クラスメソッド

  • クラス全体で共通の挙動を行う際に使用する
  • 今回だと全校生徒はClassが管理していた

あとがき

途中から全校生徒はクラス管理なのか?と疑問が出てきてしまい、悩みながらも書き抜きました。非常に良い記事とは言いにくいところがありますが、メソッドの役割理解・分類の助けになればと思います。
また、最近はPythonばかり書いているので久々にrubyと触れ合いました。文法や規約などに違反していた場合はコメント欄へ記述していただけると大変うれしく思います。

比較演算子とfor構文

$
0
0
  • while構文
$i=1;while($i<=365){print$i.PHP_EOL;$i=$i+1;}
  • 比較演算子 <=
    • 不等号のこと
    • A<B 数学ではAがBより小さい
      • プログラミングの中でも使うことができる
    • A≦B 数学ではAがB以下
      • ≦はプログラムの中で使うことができない
      • 変わりに<=を使う
    • A=B 数学ではAとBは等しい
    • A≠B AとBが等しくない
      • プログラミングで≠は使えない
      • 変わりに !== を使う
    • !A Aではない
  • $i = $i + 1; をもっと簡単に書く方法

    • $i += 1; → $i++;(インクリメント)
    • $i -= 1; → $i--;(デクリメント)
      • 掛け算と割り算には用意されていないので普通に書く
      • $i *= 5;$i /= 5;
  • for構文

for($i=1;$i<=365;$i++){print$i.PHP_EOL;}

 ↓↓↓↓↓

for (初期化処理; 繰り返す条件; 更新処理){
繰り返したい処理
}
  • for構文使えば、上のようなwhile構文もスッキリまとめることができる
  • 単純に◯回繰り返す、同じ変数を使って計算をして繰り返すような、簡単な繰り返し処理であればfor構文を使った方が良い
  • ただし初期化処理や更新処理が複雑になっている場合もある。その場合は、無理やりfor構文にまとめようとせず、while構文をつかようにする
  • 使い分けに迷ったらwhile構文を使う

※参考:Udemy/Webサーバーサイドプログラミング入門

初心者からはじめる目標管理(目標の立て方編)

$
0
0

1.概要

この時期になると上から今年度の目標を立てるように言われている人が多いと思います。しかしながら、以下のような悩みを抱えている方は多いのではないでしょうか?

  • 目標の立て方がわからない
  • 目標を立てても誰も見ない
  • 何のためにやっているのかわからない

目標とは本来、その人が目指したいものであり、その人の成長を助けモチベーションを向上させるものです。しかしながら、目標管理が形骸化して何のためにやっているのかわからない人も多いと思います。

本内容は、目標を管理しているリーダーではなく、目標を作ろうとしている現場メンバーを対象とした「目標の立て方」について記載しています。

2.目標管理の基本的な考え方

目標は大きく2つに分かれます。

  • 長期目標(わくわくするもの、今の自分では届かないもの、モチベーションが上がるもの)
  • 短期目標(長期から考えて今できるもの、コントロールできるもの、ちょっと手を伸ばせば届くもの)

このうち目標管理に使うものは短期目標の方になります。こちらが管理(コントロール)できるので、ここをもとにしながらリーダーはコーチング等を行います。

また、そのほか目標管理の基本的な考えは以下となります。

  • 短期目標は今の自分より少し高い目標を立てる(高すぎても、低くてもダメ)
  • 短期目標は7割ほど達成できればOK(ちょっと高い目標の7割は成長になる!)
  • 短期目標は数値で測れ、3つほど決めるのがが望ましい(すべてを行うことはできない…)
  • 長期目標が会社の理念とつながっているといい(達成すると業務評価が上がるので)
  • 長期・短期ともに目標は変えてもいい(市場の変化が激しいので…)
  • 誰かに目標に対してのフィードバックをもらうこと(最短1週間で、最大でも1か月)

3.目標の立て方

実際の目標の立て方について説明いたします。はじめに身も蓋もなく言ってしまうと、2章で説明した基本的な考え方は一度すべて忘れてください

なぜなら、2章の内容を含む目標を最初から立てられる人はほとんどいないからです。もし立てられるという人がいるのであれば、実際に立てて実践してみてください。おおよそ「月の残業が100時間!!」とか「目標達成率0%!!」といった目標になるはずです。

これは、現場(日本の教育)の問題でもあるのですが、自分がどこまでできるのか認識できている人が少ないことが影響しています。つまり、自己認識ができていないから、自分が何をしたいのか、どこまでできるのかわかっていないということです。
(ただ一方的に上から与えられたタスクをこなしているので。。。)

初心者がまずやらないといけないのは、目標管理をしながら自己認識を行うこと、です。そのため、目標を立てる際は以下2点だけを意識してください。

  • ちょっと背伸びしたと思う目標を立てる(長期・短期という考えは不要!)
  • 失敗しても目標を変えればいい、と考える

上記をもとにして、とりあえずの目標を立て管理してください。おおよそ1か月もあれば、高すぎて無茶だったのか、低すぎてやる気が出なかったのかがわかります。
(もしくは方向性が全く違っていたから、やる気が出なかったのか)

そして、高い低いがわかった段階で必ず振り返りをしてください。この段階では、成功しても失敗しててもいいのです。成功しているのであれば、自分が何をしたら成功するのか分かります。また、失敗しているのであれば、自分が何をしたら失敗するのか学びにもなるので、自己認識につながります

何度も目標修正、フィードバックを続けることで、自分に何ができて、何ができないのかがわかってきます。そこができてから、改めて2章の内容の目標を立てるようにしてください。

このフィードバックには自分以外の指摘があるといいのですが、上長によっては「指摘しない」、「なんでできていないんだ、と失敗を叱る」という人もいるので、フィードバックをもらう人は厳選しておきましょう。

目標の例

  • JSTQBのAL試験に合格する!
  • ○○の技術本を、月に〇冊読む!
  • 現場でテスト設計の技術を学ぶ!
  • テスト工程で発見される不具合を○件以内にするようにコーディングを行う!
  • お客様に感謝されるような行動を行う!
  • 毎月外部の勉強会に〇回参加する!
  • テストケースを1時間に〇ケース実施できるようにする!

(ちなみに私の目標は「1週間に1回はQiita記事を投稿する」です。)

4.まとめ

初心者は目標をとりあえず立てながら、自己認識を進めてください。その際、自分が楽しいと思うこと、ワクワクするものから立てる、どんどんやる気が上がっていきます。

失敗しても「これは自分に合わないものなんだな」と思って振り返れば、それは自己認識につながります。

Docker超入門

$
0
0

業務でも使わないし、ちょっと興味あるけど何かよく分からないけど触ってみたい人向けです。
私自身それなので備忘録として記載します。

1.Dockerをインストールしよう

下記サイトからダウンロードするのですが意味わからないですね。。。
https://docs.docker.com/toolbox/toolbox_install_windows/

直リンはこちら(DLverはお任せします)
https://github.com/docker/toolbox/releases

Windows10 homeの場合は上記でOKですがWindows10 proであれば下記からDLになります。
https://docs.docker.com/docker-for-windows/install/

2.Dockerを起動しよう

コマンドプロンプトで下記コマンドを叩きます。

実行コマンド
docker vesion
実行結果
Microsoft Windows [Version 10.0.18362.592]
(c) 2019 Microsoft Corporation. All rights reserved.

C:\Users\01>docker version
Client:
 Version:           19.03.1
 API version:       1.40
 Go version:        go1.12.7
 Git commit:        74b1e89e8a
 Built:             Wed Jul 31 15:18:18 2019
 OS/Arch:           windows/amd64
 Experimental:      false
error during connect: ・・・(略)

最終行にエラーが出る場合があります。
直訳するとタイムアウトだったり権限どうのと言ってきます。
その場合は、Dockerを起動してみる。無事クジラが出てくればOK。
キャプチャ1.PNG
キャプチャ2.PNG

それでもダメなら、
コマンドプロンプトを右クリックし管理者権限で起動してみましょう。
キャプチャ.PNG

3.Dockerを操作してみよう

3-1.Dockerイメージの取得と確認

実行コマンド
docker pull httpd

pullの後に、イメージ名を指定するとインターネット経由でDockerHubから取得しにいきます。

実行結果
Using default tag: latest
latest: Pulling from library/httpd
bc51dd8edc1b: Already exists
dca5bc65e18f: Already exists
ccac3445152a: Already exists
8515f2015fbc: Already exists
e35494488b8c: Already exists
Digest: sha256:b783a610e75380aa152dd855a18368ea2f3becb5129d0541e2ec8b662cbd8afb
Status: Downloaded newer image for httpd:latest
docker.io/library/httpd:latest
実行コマンド
docker images
実行結果
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
httpd               latest              c562eeace183        5 days ago          165MB

イメージが格納されたことがわかります。

3-2.Dockerイメージからコンテナを作成しよう

実行コマンド
docker run -d -p 8080:80 --name test_httpd httpd
実行結果
472e1006396556aec8a2bd9d1c8377fff139ec97b1504d4ea2bfc6c412717ace

run;コンテナを起動状態で作成(create;停止状態で作成)
-d;バックグラウンドで起動
-p;ポートフォワーディング。コンテナ外からアクセスする場合は必須(外部8080で受けてコンテナの80に転送)
--name;指定しないとDockerが勝手に決めてしまうので自身の分かりやすい名前を
httpd;取得したイメージ名を指定(centosとか)

実行コマンド
docker ps
実行結果
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS                  NAMES
472e10063965        httpd               "httpd-foreground"   8 seconds ago       Up 8 seconds        0.0.0.0:8080->80/tcp   test_httpd

STATUSに「Up」が表示されていればOKです。

3-3.インターネットブラウザからコンテナにアクセスしてみよう

ここではhttpdが起動しているコンテナ。確認で使うブラウザはchromeを推奨します。

実行URL
http://localhost:8080

解説サイトや本にはlocalhostを指定しているのですがWindows proだといけるんでしょうか?
私(home)はアクセスができなっかったので下記コマンドでDockerのIPを調べました。

起動したてのクジラのプロンプトにも表示されてますね。
管理者権限のコマンドプロンプトでは「Error getting IP address: Host is not running」と帰ってきたので通常のプロンプトかクジラのプロンプトで試してみてください。

実行コマンド
docker-machine ip
実行結果
192.168.99.100
実行URL
http://192.168.99.100:8080/

実行結果
キャプチャ3.PNG

3-3-1.コンテナ内に入ってみる

実行コマンド
docker exec -it test_httpd /bin/bash

「root@472e10063965:/usr/local/apache2#」な感じになっていればOKです。
-it;標準入力と接続を維持する?みたいな
bash;bash使って入る

適当なコマンドを実行してみましょう。

実行コマンド
ls -l
実行結果
total 40
drwxr-xr-x 2 root root 4096 Feb  2 00:15 bin
drwxr-xr-x 2 root root 4096 Feb  2 00:15 build
drwxr-xr-x 2 root root 4096 Feb  2 00:15 cgi-bin
drwxr-xr-x 4 root root 4096 Feb  2 00:15 conf
drwxr-xr-x 3 root root 4096 Feb  2 00:15 error
drwxr-xr-x 2 root root 4096 Feb  2 00:15 htdocs
drwxr-xr-x 3 root root 4096 Feb  2 00:15 icons
drwxr-xr-x 2 root root 4096 Feb  2 00:15 include
drwxr-xr-x 1 root root 4096 Feb  7 01:59 logs
drwxr-xr-x 2 root root 4096 Feb  2 00:15 modules

3-3-2.コンテナ内のファイルをいじってみる。

ディレクトリを移動してindexファイルを編集してみましょう。

実行コマンド
cd /usr/local/apache2/htdocs/
実行コマンド
vim index.html
実行結果
bash: vim: command not found

おそらく上記のようになり実行できないと思います。その場合は下記コマンドを実行しvim自体を入れてあげましょう。

実行コマンド
apt-get update
apt-get install vim
実行コマンド
vim index.html

今度は編集画面にいけると思います。
i;インサートモード
:;編集が終わったらwqで終わりましょう

再度、ブラウザよりアクセスしてみましょう。
表示が変わらないようであれば「Ctrl+F5」で更新してみましょう。

実行URL
http://192.168.99.100:8080/

3-3-3.コンテナから出る

exit

3-4.コンテナを停止する

実行コマンド
docker stop test_httpd

名前を指定していますがコンテナIDでも大丈夫です。

実行結果
test_httpd
停止確認
docker ps -a
実行結果
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS                     PORTS               NAMES
472e10063965        httpd               "httpd-foreground"   28 minutes ago      Exited (0) 4 seconds ago                       test_httpd

STATUSに「Exited」(終了しました)と表示されていればOKです。

3-5.コンテナを削除する

実行コマンド
docker rm test_httpd
実行結果
test_httpd

削除ができない旨エラーが出た場合は下記コマンドを実行してみましょう

Error response from daemon: You cannot remove a running container 472e10063965・・・(略). Stop the container before attempting removal or force remove

docker rm -f test_httpd
実行結果
472e10063965
削除確認
docker ps -a
実行結果
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS                     PORTS               NAMES

何も表示されなければOKです。

3-6.イメージを削除する

実行コマンド
docker rmi httpd
実行結果
Untagged: httpd:latest
Untagged: httpd@sha256:b783a610e75380aa152dd855a18368ea2f3becb5129d0541e2ec8b662cbd8afb
Deleted: sha256:c562eeace183d5be6dddf120b115290f4d803e5cfc023b31e76992678b5426c4
Deleted: sha256:4c1e1a8ae779e04b096b6ec82fd052b82b56d9a93fa1105b9eb316c5bf07849e
Deleted: sha256:977c52f43c25c20b67b50873c74f00cdf76215cf2b1a37e58348740df75e2a66
Deleted: sha256:7fddd9b19d8b29b7aaee5ebef26176dce7464a6b85e517401f365d693157e505
Deleted: sha256:1620bdc7bd85ab5e753b58a7e648f46a883108e9bc410560d4558c780cf13ffd
Deleted: sha256:488dfecc21b1bc607e09368d2791cb784cf8c4ec5c05d2952b045b3e0f8cc01e
削除確認
docker images
実行結果
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

何も表示されなければOKです。

Rのplot()について ---初心者向け---

$
0
0
tags: rBasicLearningRplotBeginner初心者向け

Rのplot()について

Rのplot()についてまとめました!
宜しければ, 使ってください!

plot()は, データの種類ごとに異なった図を表示する.

使用するデータセット

今回は, irisのデータセットを使用します.

library(datasets)iris

質的データ

質的変数は以下のような棒グラフのような図が表示される.

plot(iris$Species)# Categorical variable

量的データ

量的変数は以下のような散布図が表示される.

plot(iris$Petal.Length)# Quantitative variable

質的データと量的データ

質的データをx軸量的データをy軸に置くと, 以下のような図になる.

plot(iris$Species,iris$Petal.Width)# Cat x quant

両方量的データ

両方量的データの場合は, 以下のような散布図になる.

plot(iris$Petal.Length,iris$Petal.Width)# Quant pairquant

plot(x)だけ

plot(x)だけの時は, 変数ごとの全体のグラフの概観をみれる.

plot(iris)# Entire data framepairquant

グラフを整える

点の色, 点の大きさ, グラフのタイトル, x軸ラベル, y軸ラベルは, 以下のように指定する.

# Plot with optionsplot(iris$Petal.Length,iris$Petal.Width,col="#cc0000",# Hex code for datalab.cc redpch=19,# Use solid circles for pointsmain="Iris: Petal Length vs. Petal Width",xlab="Petal Length",ylab="Petal Width")

数式の公式も範囲指定でプロット

数式も範囲指定でプロットすることができる.
今回は, コサイン・exp・正規分布のグラフをプロットした.

plot(cos,0,2*pi)plot(exp,1,5)plot(dnorm,-3,+3)



正規分布で出力

正規分布でラインに色をつけ, 太さも太くして, プロットしてみた.

# Formula plot with optionsplot(dnorm,-3,+3,col="#cc0000",lwd=5,main="Standard Normal Distribution",xlab="z-scores",ylab="Density")


[Python]リストの要素だけを並べて表示させる(縦並び、横並び)

$
0
0

はじめに

オンラインでのプログラミング学習、スキルチェックなどで出力の方法が限定されていることが多々あると思います。
自分も答えは出ているのに思ったように出力できないことがあったので調べたことをまとめてみました。
同じような思いをした人は必見です!

リストの要素を縦に並べて表示させる

[方法1]リスト内包表記の中にprint()を入れる

ex.py
L=["a","b","c","d"][print(i)foriinL]

[方法2]1文字ずつ文字列をスライスしてprint()を入れる

ex.py
L=["a","b","c","d"]foriinL[0:]:print(i)

いずれにしても実行結果は以下のようになります。

a
b
c
d

リストの要素を横に並べて表示させる

.join()を用いることで空白を開けて表示させる

ex.py
L=["a","b","c","d"]L=' '.join(L)print(L)

実行結果は以下のようになります

a b c d

','.joinを用いると

a,b,c,d

となるように.join()の前の''内の要素は自由に設定可能です。

.join()を用いない方法

.join()を用いなくても出力することはできます。

ex.py
L=[['a','b','c','d']]print(*L[0])

実行結果

a b c d

数字(int値)で.join()は使えない

※リスト内の値がint値のみの場合.join()は使用不可(エラーが出ます)
このような時は、str値に変換してから.join()を使います

ex.py
L_int=[1,2,3,4]L=[str(a)forainL_int]L=" ".join(L)print(L)

実行結果は以下のようになります

1 2 3 4

最後に

今回記載した以外にも何か方法があれば教えてもらえると嬉しいです。

heroku デプロイ ワークフロー 自分用

$
0
0

cloud9上でherokuをインストールする
$ source <(curl -sL https://cdn.learnenough.com/heroku_install)

一応ちゃんとインストールされてるかチェック
$ heroku --version
heroku-cli/6.15.5 (linux-x64) node-v9.2.1みたいなのが出てきたらOK)

herokuにログイン
$ heroku login --interactive

公開鍵を追加
$ heroku keys:add

herokuに新しいアプリケーションを作成
$ heroku create <アプリケーション目(省略可)>

herokuにデプロイする
$ git push heroku master

webアプリからアクセスする
$ heroku openと入力して出てくるURLにアクセス
(なんか出てきたURLを適当にブラウザにブチ込んで
Method Not Allowed
とか表示されるのはURLからだった。。。)

デザイナーのためのFish Shell入門(Mac編)

$
0
0

前置き

大抵の黒い画面が苦手って言う人ってコマンド覚えられないとか、なんか間違ったもの打つと怖いとか、ディレクトリの移動とかよくわかんないってなると思うんですよ。わかるわかる。そんなわけでデザイナーやコマンド叩き始めたけど難しいめんどくさい黒いのヤダヤダ怖いって人向けの記事です。

※ この記事は2018年に書きかけのまま発酵させていたものですが多分そのまま行けると思います。ダメだったら教えて。

tl;dr(長すぎるから読みたくない)

  1. Fish shellを使うとコマンドの打ち間違いとかが減るから使おう
  2. まずHomebrewをいれて
  3. Fish shellをいれる
  4. 黒い画面に fishって書いてreturnキーを押したら
  5. おわり
  6. VSCodeとか入れるといいよ(フロントエンド沼へ、ようこそ!)

デザイナーを取り巻く昨今のあれこれ

最近はデザイナーもcui(ターミナル、コマンド、黒い画面と呼ばれしモノ)使わされることが増えてきましたね。コードも書く人なら特に。sass/scssとか使う環境だとか、タスクランナーが必要だとか。node.jsとか使ったり、Git使ったり。主にwebですね。
ただ、デフォルトだととても使いづらい。そしてプログラマーは環境整備までは面倒見てくれない事が多いです。わからないことがわからないので教えられないってのもありますね。しかたない。しかたなくねぇよ。

多数派はbash/zsh

コマンドラインの入門ってなるとデフォルトになってることが多いbashや、多数派に釣られてzshつかうと思うんですよ。ぼくはzsh。
bashやzshが悪いって言ってるわけじゃないです。設定すればいいでしょって話ですよね。
ただ、デザイナーがコマンドを触るとかそのくらいの感覚だとzshを導入して色々設定してっていうのが本当に最適かなぁってなると違うかなーって思うんです。もっと簡単に済ませられるはずだ。

どうしろというのか

これをつかえ → Fish shell

Fish shellをインストールしよう

Homebrewを入れよう

Homebrew* が入ってると便利ですよね。入ってる人は飛ばしていいです。

まずはターミナルを起動します。cmd + space とかで Spotlight を開き、Ter とか打てば出てきます。
これで黒い画面が開いたと思います。

次に Homebrewを開き、ページ上部にあるコマンドを黒い画面に打ち込みましょう。
このステップ以降はもう怖いことはありません。大丈夫。一旦落ち着きましょう。リラックス。
途中で Y/n と表示されたら何も考えずに y でいいはずです。
一通り終わった気がしたらbrew -vと打ってみてください。 Homebrew 2.x.x のように表示されていればOKです。
*Homebrew では他にNode.jsのバージョン管理など便利なものがたくさんあります。覚えておくといいでしょう。
はい、怖い操作はここまでです。よく頑張りましたね。

Fish shellを入れよう

黒い画面に brew install fishと入力します。
たまに Y/n と聞かれたら、何も考えずY でいいはずです。これでインストールは終わりです。簡単ですね。

外見を変えよう

黒い画面に fishと入力します。なんとなく黒い画面が変わった気がしましたか?
これで黒い画面は一時的にFishを使うように変更されました。
続いて fish_configと入力します。
fish_configと入力した時点でブラウザが自動で開いてるかもしれません。開いてない人は黒い画面に謎のファイルパスが出たと思います。出ましたか?ブラウザのURL欄にコピペしてみましょう。何か出ましたね。これがFishのコンフィグ画面です。

はい。なんとブラウザから編集できるんです。凄いですね。
さて、いくつかタブ分けされているのに気が付くと思います。基本使うのは2つまでかと。

  1. Colors
    • シンタックスハイライトのパターンを設定します
    • 見やすい色に変えましょう。もう黒い画面とは言わせません
  2. Prompt
    • ディレクトリ名とか名前とか出るやつですね。ここもお好みで変えましょう
    • Gitを使っている場合、ブランチ名などを表示することが出来ます

これらを変更するだけでだいぶそれっぽくなります。

使ってみよう

まずは簡単に触ってみましょう。黒い画面を開いたら fishと入力してみてください。
これでfish shellに切り替わったはずです。

ディレクトリを移動してみよう

黒い画面で cdまで打って、Tabキーを押してみましょう。
はい、ディレクトリ名がずらっと出たかと思います。これは今黒い画面で開いている場所、つまりユーザー(あなた)のディレクトリ直下のはずです。
パス的には、ぼくであれば/user/rTachibanaですね。
ここで何かしらの文字を打ってからTabキーを押すと、存在するディレクトリの中からその文字を含むディレクトリないしファイルで絞り込めます。便利ですね。
これはコマンドでも利用できます。たとえば今いるカレントディレクトリ(場所)が知りたいときはpwdを使いますが、p を打った時点で予測で出ているはずです。これがFish shellを勧める理由です。
要は、あなたのコマンド入力を協力にサポートしてくれるわけです。この機能を使ってディレクトリの移動とかしていれば間違いを減らしつつ作業効率は上げられるはずです。

コマンドの打ち間違いって怖いよね

上記でおわかりと思いますが、Fish shellを導入するだけで一気に難易度は下がるはずです。
なんか間違ったこと書いたらデータ吹っ飛びそうとか、黒い画面に疎いデザイナーさんはそう思うことも多いかと思います。仕方ないね。
ですが、最近は割とデザイナーにそういった操作を求めることも増えてるのが事実かと思います。デザイナーなのにGitを黒い画面で操作させられて苦労した人を知っています。それは極端かもしれませんが、多少触れたほうがいいのは事実。なので使いやすい環境を作ってしまいましょう。
ただし、間違ったコマンドを打ったらまずいかもという気持は大事にね。

ついでにおすすめするもの

Mac使ってるエンジニアさんの大半はiTerm2っていう黒い画面を使ってると思います。あとはVSCodeっていうエディタが黒い画面内蔵みたいな便利ツールなので本当におすすめです。調べてみてね。
使い方を覚えた頃にはきっと、フロントエンド沼に足を踏み入れていることと思います。給料上がってるといいね。

おしまい。

初心者向けのWebサーバのバックアップシェル解説

$
0
0

はじめに

初めまして、フロントエンドエンジニア志望のタケダです。
企画・制作を行っている株式会社LockUPにインターンしてほぼ未経験からエンジニアの作業を行った時の記録になります。

今回はシェルが分からないところからバックアップを実行するシェルの改修を行った記録です。
私はコマンドはある程度知っており、シェルという言葉は知っていましたが実際使ったことはありませんでした。
ですがこのお仕事を通じてシェルの基本的な読み書きができるようになり、全く分からないことでも調べて解決するということが出来るようになりました。
現在では保守のお手伝いとして今回のスクリプトを使ってバックアップ取得作業などを行っています。
この記事を初心者エンジニアや未経験の方に読んでいただき、少しでも力になれればと思います。

今回は実際のサービスで運用している形に近いシェルを見てもらい、それを解説するという流れで進めます。
シェルを書いたことない人は是非一緒に進めてみましょう!
また下記のようなサイトでも合わせて勉強してみましょう!

記事の対象者

この記事は以下のような人を対象にしています。

  • Linux,Unix系を使い始めた人。
  • シェルを覚え始めたけどまだ一人では書けない人、コマンドがある程度使えるがシェルで書いたことがないエンジニア。
  • 自社Webサービスや受託Webサービスの保守などの担当になったフロントエンドエンジニア。

1.作業の時の流れ

  • シェルを読み込む。
  • 分からないところが出てくるので調べる。(※ここに非常に時間がかかります。)
  • なんとなくやってることを理解したら実行したいコマンドを書き出す。
  • コマンドが成功したら次に進む。失敗したら原因を調べて正しいコマンドに直す。
  • 完成したコマンドを書き出したらそのコマンドを実行するための条件をつける。
  • シェルを書いて実行する。
  • 間違っていたらエラーを調べて原因を探る。そして改修する。
  • どうしても解決できなかった場合は先輩やメンターの方に聞く。いなければ質問できるサイトを頼る。

2.まずシェルを読み込んで解析

まずはシェルの改修のために参考にするスクリプトを上から読んでいきます。
実際に使用しているものに近いスクリプトを一緒に見ていきましょう。
下記は参考にするだけで今回使わないコマンドなども多くありますので流し見で良いです。

#! /bin/shif[$1="production"]then
  echo"本番環境のバックアップを実行します。"path_to_exec='/var/www/html/XXX/exec/'elif[$1="staging"]then
  echo"ステージング環境のバックアップを実行します。"path_to_exec='/var/www/html/XXX/exec/'fi

if[!-e$path_to_exec/html_list.txt ];then 
  ip=`/sbin/ifconfig eth0 | grep'inet addr' | awk'{print $2;}' | cut-d: -f2`echo not exist html_list.txt in$ipecho /home/username
  exit 1
fi

exit;emp_area=`df-h`today=`date +"%Y%m%d"`purgeday=`date-d'1 week ago' +"%Y%m%d"`for dt in`grep-v ^# ${path_to_exec}/html_list.txt`do
  arr=(`echo$dt | tr-s','' '`) 
  dir=`basename${arr[0]}`cd${arr[0]} 
  cd .. 
  if[-z"${arr[2]}"];then
    tar czf /home/username/backup/${arr[1]}.tar.gz $dir 
  else
    tar czf /home/lusername/backup/${arr[1]}_$today.tar.gz $dir-X${arr[2]}fi
done
/home/username/backup/*.tar.gz bck@$bcksrv:~/backup

if[-e /home/username/bin/db_list.txt ];then
  for dt in`grep-v ^# /home/XXX/bin/db_list.txt`do
    arr=(`echo$dt | tr-s','' '`)MYSQL_PWD="${arr[1]}"  mysqldump -u${arr[0]}${arr[2]}> /home/username/backup/${arr[3]}_$today.dmp
    unset MYSQL_PWD
  done
fi

BACKUP_DIR="/home/username/backup"RES="${BACKUP_DIR}/result_log"
find ${BACKUP_DIR}/ -maxdepth 1 -regex'.*\.\(gz\|txt\|dmp\)'-mtime +28 -type f | xargs rm-rf>>${RES}

php ./backup_slackbot.php $today"$emp_area";

分かりましたでしょうか?
私のレベルは

  • 条件の中身は分からないけどifで条件分岐をしている。
  • echoで文字を返している。
  • cdでディレクトリを移動している。

そんなレベルでした。全部は理解できなくでも大丈夫です。
次は調べていきましょう。

3.分からなかったらまず調べる

調べるサイトをいくつか紹介します。

  • google
    言わずと知れたGoogle先生。まずはググりましょう。
  • Qiita
    皆さんが今見ているであろうQiitaには技術系の記事がかなりあります。
    Qiita内で検索することでより求めている情報が手に入りやすいです。
    ググった後にここに行き着くことも多々ありました。
  • hacknote
    直接hacknote内で検索することはありませんでしたが、ググった後に行き着いて記事を参考にすることもありました。

では実際に調べて行きましょう。
\$1=は何を表しているか。「\$1 シェル」などでググります。
すると以下のようなページに行き着きました。

Unix・Linuxシェルスクリプトコマンドリファレンス

\$1 - \$n シェルスクリプト実行時に指定した引数の値がそれぞれ設定される変数。 1番目に指定した引数は \$1 に、2番目に指定した引数は \$2 に、n 番目に指定した引数は \$n に設定される。

要するにシェルを実行する際に「./backup.sh 引数」とすることで\$1に値が入るということです。
そして今回はproductionという引数かstagingという引数の時それぞれのディレクトリのパスを指定しています。
こうやって情報を探し出し1個ずつ潰して行きます。
全部書いていくと長くなるので今回はとりあえずシェルを書きます。
調べることは非常に時間がかかりますが、必ず身につくのでここは時間をかけてしっかり行いましょう。

4.とりあえずシェルを書いてみる

まず完成したシェルを見て行きましょう。

backup.sh
#! /bin/shif[$1="production"]then
  echo"本番環境のバックアップを実行します。"path_to_exec='/home/username/backup_resources/backup_list/production'elif[$1="staging"]then
  echo"ステージング環境のバックアップを実行します。"path_to_exec='/home/username/backup_resources/backup_list/staging'fi

emp_area=`df-h`today=`date"+%Y%m%d"`for dt in`grep-v ^# ${path_to_exec}/html_list.txt`do
  arr=(`echo$dt | tr-s','' '`)dir=`basename${arr[0]}`cd${arr[0]}cd ..
  if[-z"${arr[2]}"]#tarcommand="tar czf /var/www/backup/${arr[1]}.tar.gz $dir"tarcommand="tar czf /var/www/backup/${arr[1]}_${today}.tar.gz $dir"echo$tarcommandtar czf /var/www/backup/${arr[1]}_${today}.tar.gz $direlse
    tarcommand="tar czf /var/www/backup/${arr[1]}_${today}.tar.gz $dir --exclude ${arr[2]}"echo$tarcommandtar czf /var/www/backup/${arr[1]}_${today}.tar.gz $dir--exclude${arr[2]}fi
done

if[-e${path_to_exec}/db_list.txt ];then
  for dt_wp in`grep-v ^# ${path_to_exec}/db_list.txt`do
    arr_wp=(`echo$dt_wp | tr-s','' '`)mysqlcommand="mysqldump --defaults-file=${arr_wp[1]} -u ${arr_wp[0]} -h localhost ${arr_wp[2]}> /var/www/backup/${arr_wp[3]}_${today}.dmp"echo$mysqlcommand
    mysqldump --defaults-file=${arr_wp[1]}-u${arr_wp[0]}-h localhost ${arr_wp[2]}> /var/www/backup/${arr_wp[3]}_${today}.dmp
fi

backup_dir="/var/www/backup"
find ${backup_dir}/ -maxdepth 1 -regex'.*\.\(gz\|dmp\|txt\|sql\)'-mtime +28 -type f | xargs rm-rfcd /home/username/backup_resources

php ./backup_slackbot.php $today"$emp_area";

コマンドを書き出す

いきなり完成したシェルを書きたいのですが、初めに行うのは実行するコマンドを書き出すところから行います。
まずはtarのコマンドを用意します。

tar czf /var/www/backup/${arr[1]}_${today}.tar.gz $dir

シェルの中では変数などを扱っていますが実際に実行できるコマンドを用意します。

tar czf /var/www/backup/projectname_2020205.tar.gz html

このコマンドが実行できることを確認したら、徐々に条件文などをつけてカスタマイズしていきます。
tarのオプションが分からない方は本来ならググるところですが、今回は「tar czf オプション」でググった結果のここを参考にします。

\${today}はdateコマンドからyyyyMMddの形式で取得したスクリプト実行時の日付が入ります。

${arr[1]}はhtml_list.txtの中にある情報をarrという配列に入れ、表示したものです。
html_list.txtにはバックアップを取得するパス、生成されるファイル名、バックアップを除外するディレクトリなどが記載されています。

html_list.txt
#<バックアップパス>,<tar.gzファイル名>,<除外リストファイル名>
#例)/var/www/html,example-html,/var/www/html/exec
/var/www/html,sample_stg,

まずgrepコマンドでdtという変数に上記の先頭に#がついていな列の文字を入れます。
その後trコマンドで,を空白に置き換えます。そうすることでarrに配列としてarr[0]にディレクトリのパスである/var/www/html、arr[1]にバックアップを作成するときの名前、sample_stg、arr[2]に除外したいファイル、今回の場合は何も入りません。

実際にtarで毎週データを取るとなると、膨大な容量になる場合もありますので、週次のバックアップからは除外したいディレクトリも出てくると思います。
除外したいファイルがあった場合はコマンドを付け足さなければなりません。
なのでtarコマンドをもう一つ用意します。

tar czf /var/www/backup/${arr[1]}_${today}.tar.gz $dir--exclude${arr[2]}

除外したいファイルがある場合のtarコマンドとない場合のtarコマンドの2種類が用意できましたので、if文を使って処理を分岐させてあげます。

if[-z"${arr[2]}"]tar czf /var/www/backup/${arr[1]}_${today}.tar.gz $dir

まずは${arr[2]}に文字列がないとき、つまり除外したいファイルがない場合のコマンドを書きます。

else
    tar czf /var/www/backup/${arr[1]}_${today}.tar.gz $dir--exclude${arr[2]}

次に除外するファイルがある場合は--excludeで除外してあげます。

さらに肉付けしていきます。
html_list.txtファイルからディレクトリ情報を取得します。
バックアップを取得するにはそのディレクトリまで移動する必要があるのでcdします。
コマンドが実行されたか確認するためにechoコマンドも追加します。
ファイル名の日付を設定するコマンドも追記します。
これで大枠はできました。

 today=`date"+%Y%m%d"` for dt in`grep-v ^# ${path_to_exec}/html_list.txt`dir=`basename${arr[0]}`cd${arr[0]}cd ..
 if[-z"${arr[2]}"]tarcommand="tar czf /var/www/backup/${arr[1]}_${today}.tar.gz $dir"echo$tarcommandtar czf /var/www/backup/${arr[1]}_${today}.tar.gz $direlse
    tarcommand="tar czf /var/www/backup/${arr[1]}_${today}.tar.gz $dir --exclude ${arr[2]}"echo$tarcommandtar czf /var/www/backup/${arr[1]}_${today}.tar.gz $dir--exclude${arr[2]}fi

最後にシェルを実行する際に渡す引数によって、本番環境かステージング環境のパスを設定するか条件分岐をさせてあげます。

if[$1="production"]then
  echo"本番環境のバックアップを実行します。"path_to_exec='/home/username/backup_resources/backup_list/production'elif[$1="staging"]then
  echo"ステージング環境のバックアップを実行します。"path_to_exec='/home/username/backup_resources/backup_list/staging'fi

today=`date"+%Y%m%d"` for dt in`grep-v ^# ${path_to_exec}/html_list.txt`dir=`basename${arr[0]}`cd${arr[0]}cd ..
 if[-z"${arr[2]}"]tarcommand="tar czf /var/www/backup/${arr[1]}_${today}.tar.gz $dir"echo$tarcommandtar czf /var/www/backup/${arr[1]}_${today}.tar.gz $direlse
    tarcommand="tar czf /var/www/backup/${arr[1]}_${today}.tar.gz $dir --exclude ${arr[2]}"echo$tarcommandtar czf /var/www/backup/${arr[1]}_${today}.tar.gz $dir--exclude${arr[2]}fi

backup_list配下にproductionとstagingのディレクトリを作成し、html_list.txtをそれぞれ置いてあげます。
ひとまずはtarコマンドでバックアップを取得するスクリプト完成です。

次はmysqldumpファイルを取得するスクリプトを作成していきます。
基本的にはコマンドが変わるだけでやり方は同じですので手短にいきます。

まずはじめにmysqldumpを取得するコマンドを用意します。

mysqldump --defaults-file=${arr_wp[1]}-u${arr_wp[0]}-h localhost ${arr_wp[2]}> /var/www/backup/${arr_wp[3]}_${today}.dmp

arr_wpにはhtml_list.txtと同様にdb_list.txtにmysqlに必要な情報が書いてあります。

db_list.txt
#<ユーザ名>,<パスワード>,<DB名>,<ダンプファイル名>
#例)rootd,Take0203,wordpress,testsite-wordpress
user_stage,/home/user/.stage.cnf,stage_db,project_stg

これを先ほどと同じ要領でarr_wpに入れてmysqldumpコマンドで使います。
続けて条件ですが、mydqldumpを必要としないサーバーもあると思いますので、db_list.txtがある場合だけ処理を行いたいです。そのための条件をつけます。

if[-e${path_to_exec}/db_list.txt ];then
  for dt_wp in`grep-v ^# ${path_to_exec}/db_list.txt`do
    arr_wp=(`echo$dt_wp | tr-s','' '`)mysqlcommand="mysqldump --defaults-file=${arr_wp[1]} -u ${arr_wp[0]} -h localhost ${arr_wp[2]}> /var/www/backup/${arr_wp[3]}_${today}.dmp"echo$mysqlcommand
    mysqldump --defaults-file=${arr_wp[1]}-u${arr_wp[0]}-h localhost ${arr_wp[2]}> /var/www/backup/${arr_wp[3]}_${today}.dmp
fi

これでmysqldumpファイルも取得できるコマンドができました。

バックアップファイルは取り続けているとサーバーを圧迫してしまうと思うので、今回は28日をすぎたファイルは削除してあげるように記述をします。

find ${backup_dir}/ -maxdepth 1 -regex'.*\.\(gz\|dmp\|txt\|sql\)'-mtime +28 -type f | xargs rm-rf

最後に今回の記事では使わないのですが、ディスク容量をチェックするコマンドとそれらをslackに通知するアプリケーションのコマンドを記載し、今までのコマンドをマージすれば完成です。

実行するときは、./backup.sh [production]or[staging]という風に引数を指定してあげます。

5.仕事の進め方・質問の仕方・シェルの作り方

仕事の進め方

基本はトライアンドエラーでどんどん試していきます。
一個一個コマンドを実行する際には報告をします。
もしrmコマンドなどが入っていて必要なフォルダを消してしまっては大問題です。
少なくともなんのコマンドを実行したかの履歴は残しておきましょう。

質問の仕方

まずは質問する前に分からないことは調べます。
そして質問する際は自分がどこまで分かっていて、どこが分かっていないのかを把握してから質問します。
これをすれば相手も何を教えればいいか把握できます。
調べ方が分からない、調べる用語が分からない場合は思い切って質問しましょう。

シェルの作り方

最初は参考になるシェルなどを読み込みます。
読み込むことでそのあと自分がやりたいことがかけるようになります。
そしてシェルを書くときは実行したいコマンドから書き、そのあとに条件など考えていきます。
そして動かなかったら参考になるシェルがどのような処理をしているかを読んで、なぜ自分のコードが動かないか確かめます。

6.メモを取ってやったことをまとめる

調べたコマンドなど用語などをまとめましょう。またどんなことで躓いたかなども書いておきます。
メモを取ることで次回同じ作業を行った時に詰まった場所や分からなかったコマンドの解決が早くなります。
調べたサイトなども貼っておくと便利だと思います。
メモに使えるアプリケーションなども教えてもらいました。
今回はDropbox Paperを使いました。Markdownも使えて便利です。

7.作ったスクリプトを2台目のサーバにも対応させる作業、スクリプトの改善

1台目の作業がうまく行ったら2台目のサーバーに適応させるために改修を行います。
修正すべき点はディレクトリ名、ユーザー名、リストファイルです。
そして一つのスクリプトが完成した時には気づかなかったミスや改善点が見つかります。
今回の例でいうと/var/www/backup/と何回も書いている場所は
backup_dir="/var/www/backup"を用意してあげて、${backup_dir}と書くことで
次回別サーバのバックアップ対象が/var/backupになったら1行の修正だけで済みます。
findコマンドの直前に書いてあるのにもっと早く使えることに気づきませんでした。
また、シェルを実行する際に引数を私のではなくreadコマンドなどで入力を受け付ける方式などにした方が、使う人にとっては分かりやすいのではないかと思いました。

まとめ

今回のインターンでは私はシェルについては知っている程度で一人で書くことは到底できませんでした。調べ方や進め方も正直分からなかったです。
ですが、全然分からないことでも1つ1つ潰して手を動かしていけば理解できるようになることが分かったので、未経験の方やシェルを書いたことない人、コマンドすら知らない人でもシェルは怖くないということを伝えたいです!
また、一つ分からないことを理解できるようになると他のことにも応用がきいてくるので他の言語や分野に挑戦できます。
これをきっかけとして、シェルだけでなく触ったことのない言語やプログラムに挑戦する人が増えればいいなと思います。

初心者がプログラミングで挫折しないための考え方

$
0
0

Qiitaの皆さんこんにちは。Fumiyaです。😃

プログラミング学習の経験者で、プログラミング学習をやめたことがある、挫折したことがある人の数は、私達が想像する以上に多いようです。あるエンジニア育成スクールの調査によると、アンケート調査の結果、プログラミング学習を中断、挫折したことがある人が9割を占めることが分かっています。

プログラミングに挫折する理由というものは、実はある程度決まっています。大きく分けて、「環境構築」と「エラー」、そして「独学」です。

プログラミングを開始するためには、プログラミング言語やその他の必要なものをダウンロード、インストールする必要があります。これらの作業はプログラミングを行うための環境を作るということから、「環境構築」と呼ばれています。環境構築で挫折するケースが多いという事実があります。プログラミングの環境構築の手順は複雑なものが多く、特に初心者によっては一筋縄ではいかないところがあるようです。

人気言語の一つ、Ruby言語をWindowsオペレーティングシステムにインストールし、環境構築を行い、プログラミングを開始することができるようになるまでには、いくつものステップを踏む必要があります。

プログラミングの環境構築で挫折しない方法…それはつまり、環境構築のステップそのものを短くしてしまうことです。そのような理念から生まれたソフトウェアがあります。これを使うことで、プログラミングの環境構築の手間をたった一度のステップにまで短縮することが可能となります。それは、「Docker」です。現時点でプログラミングをある程度経験している方であれば、Dockerに挑戦して見ることは悪い選択ではありません。

実は、プログラミングを始めることはとても簡単です。Google検索で”Ruby REPL”などと検索してみてください。REPLは対話型実行環境、簡単な言い方をすると、プログラムのコードを、まるで人と対話するかのように、双方向的に実行できる環境のことを言います。

repl.it https://repl.it/languages/ruby
repl.it https://repl.it/languages/html

このプログラムは、Ruby言語で実行できる最も簡単なプログラムの一つです。このコードをコピー・アンド・ペーストし、”Run”ボタンをクリックしてプログラムを実行してみましょう。

puts"hoge"

https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_54a8ab77-28b5-43fe-bb03-c075d393789f.gif

環境構築を無事に行うことができたとしても、プログラミングにはエラーというものがあります。

あなたはもしかして、プログラミング学習中にエラーに遭遇した時、日本語でGoogle検索をしてはいませんか?プログラミングでは日本語はご法度です。英語ができない方は、Google翻訳を使ってでも、英語で検索してみましょう。

エラーの原因が特定のライブラリやフレームワークにあるということが分かりきっている場合、Google検索をするよりも、Github Issueを検索したほうが効率的な場合があります。

プログラミングのエラーの原因と対策についてお話しましたが、実はもう一つ、とても重要な要素があります。それは、「開発環境」です。

なぜ、WindowsやMacでプログラミングをすることは非推奨なのでしょうか。簡単に言うと、「WindowsやMacでプログラミングをするとエラーに遭遇しやすくなる」という理由があるからです。

プログラムの多くは、”Linux”で動作させることを前提に作られています。例えばRuby言語それ自体はWindowsやMacでも問題なく動作しますが、ここにnokogiriというライブラリをセットにして考えると、一気にWindowsやMacはエラーを出す確率が上昇します。

プログラミングで挫折しないために絶対に欠かしてはいけないこと、それは、 「プログラミングを心から楽しむ」 ことです。

厳しい言い方になりますが、好きじゃないプログラミングを嫌々やっているような人は、絶対に良いプログラマーにはなれません。

プログラミングをやめてしまう前に、一度自分とよく向き合い、自分が本心では何をやりたいと思っているのか、よく考えてみましょう。

この投稿は、長文を読んでいる時間がないQiitaの皆さん方向けに編集されたものです。全文は私のブログ(以下URL)でご覧いただけます。

プログラミング学習で挫折しない方法 (https://yuis-programming.com/?p=2240)

✓ この投稿が気に入ったら いいね! や シェア をお願いします 😁

[Python 入門] 日経平均とNYダウのcsvデータを結合する

$
0
0

[Python 入門] 日経平均とNYダウを結合する

今回はタイトルを変えてみましたが内容にあまり変わりません。
前回の続きをやっていきます。

データの準備

今回は2つのcsvデータ(日経平均とNYダウ)を使います。

nikkei = pd.read_csv("nikkei.csv", parse_dates=['データ日付']) #csvデータを読み込む
nikkei.tail()

NYのデータは画像のとおりです。

NY = pd.read_csv("NYd.csv", parse_dates=['データ日付'])
NY.head()

データの結合をする

#データの結合をする
join_data = pd.merge(nikkei, NY[["データ日付", "終値", "始値", "高値", "安値"]], on="データ日付", how = "left")
join_data.tail() #表示してみる

日経平均のデータにNYダウのデータを結合します。データ日付を共通なものとして結合させました。"~_x"が日経平均、"~_y"がNYダウに当たります。
2020-02-07.png

プロットしてみる

前回(過去記事参照)と同じようにやってプロットしておきます。

nikkei_close = go.Scatter(x = join_data['データ日付'][-200:], 
                        y = join_data['終値_x'][-200:], 
                        name = "nikkei_close", 
                        line = dict(color = '#000000'), #黒色の線にする
                        opacity = 0.8)

NY_close = go.Scatter(x = join_data['データ日付'][-200:], 
                        y = join_data['終値_y'][-200:], 
                        name = "NY_close", 
                        opacity = 0.8)

data = [nikkei_close, NY_close]

layout = dict(title = "日経平均とNYダウ", )
fig = dict(data = data, layout=layout)
iplot(fig)

2020-02-07 (1).png
こんな感じになりました。ところどころNYダウの値がありません。いわゆる欠損値がありますね。
たぶんそれはNY市場の休場かと思います。今のところは謎?
今回はデータ結合しただけですが、コード部分の話は以上です。

雑談

今回はデータ結合の話でした。ですが、ただ結合しただけではいくつか課題点が見えてきますね。

  • グラフの欠損値はなにか
  • 日経平均とNYダウのグラフを重ねて表示したい
  • 相関関係はあるのか(ヒートマップでよい?)
  • 他に何か分析できる?

といったところでしょうか。解決などできたらまとめようかと思います。:grin:

人の感情を可視化するアプリを作りました【キドアイラク】

$
0
0

はじめに

皆さん初めまして!
本記事は私がrailsで作った初めてのアプリである「キドアイラク」の紹介記事になっています。
スクリーンショット 2020-02-07 16.08.35.png

https://kidoairaku2019.herokuapp.com

この「キドアイラク」がどのようなアプリかというと、タイトル通り「人の感情を可視化する」アプリです。
自分がここ数日どんな感情で過ごしていたのか、他の人はどんな時にどんな感情を抱くのかを一目で確認することができます。
街中を歩く一人一人の感情が透けて見えるイメージです。
本サービスを作った背景や機能は後ほど詳しく語りたいと思いますので、もし興味がある方は読んで頂けると幸いです。

そして、僅か一ヶ月ほどで作ったのでショボい作りにはなっていますが、是非一度使っていただけると嬉しいです。

作った理由

ある一枚の画像

このサービスを作るきっかけになったのはある一枚の画像です。
lain.jpg
この画像は1998年に放送された『Serial experiments lain』というアニメのワンシーンです。
ネット上で顔の見えないアバターが好き勝手に意見を言い合っています。
このシーンを見たとき、現在SNS上で起こる炎上をうまく表現されていると感じました。
全く顔も表情も分からないユーザー同士が140字程度で意思疎通を図るなんて土台無理な話です。
元々SNSの炎上に対する嫌悪感があったので、この画像を見ながら「どうすれば炎上しないSNSを作れるだろうか」と考えていました。
そこで思い浮かんだのが「文章に感情を付ける」というアイデアでした。

今のSNSには「感情」が足りない

現実とインターネットの最大の違い、それは「感情」が見えるかどうかだと思います。
例えば、現実世界で挨拶する時、私たちは相手の表情、声のトーン、雰囲気から、相手がどんな感情かを判断することができます。
一方、インターネットの中では、どんな気分でいたとしても「おはようございます」の一言で表現できてしまいます(絵文字や顔文字が付く場合もありますが)。
これでは相手の気持ち、感情を全く理解することができません。
また、現在のSNSは構造上、どうしても自己顕示欲に塗れた人たちが多くなってしまうので、結果的に相手の意見を理解しようともせず自分の考えを押し付けるユーザーが発生してしまいます。
それがSNSで炎上が起こる原因だと感じました。
もし、ネット世界で相手の感情を簡単に理解できるようになれば、ネット上のコミュニケーションはどう変化するだろうか。
いつしかそんなことに頭が支配され始めました。

「感情」を健康にしたい

これはサービスを作り終わった後に思い付いたことです。
みんなジムに行ったり、ジョギングしたり、自分の身体を痛めつけることで健康を維持(確認)していますが、一週間に一回自分の感情を確認することは怠っています。
しかし、感情を確認することは非常に重要です。
自分がどんな時に感情を変化させるのか、最近の自分の感情はどんな割合なのか。
それを徹底的に理解しなければ、真の意味で健康にはなれないのではないでしょうか。

人の感情が知りたい

このサービスを作った最後の理由。
それは、「人の感情が知りたい」という単純な願望です。
私はある時期から、街中を歩いている一人一人が何を考えているのか、どんな感情で生きているのかと疑問に思って生きてきました。
この記事を読まれている方の中にも、そんな人がいると思います。
しかし、実際に街中の人に話しかけることもできず。
また、現状のSNSでは的確な感情把握ができません。
それなら自分で作るしかない、ということで「キドアイラク」を作ることを決めました。

キドアイラクの三つの機能

ここからは「キドアイラク」の主な機能について説明します。

自分の文章に感情をつける

スクリーンショット 2020-02-07 16.11.37.png
本サービスでは文章を投稿する際に「喜怒哀楽」の四つの感情をつけていただきます。
投稿された文章には感情が表示されるので、その文章がどんな感情で書かれたのか、一目でわかります。
また、文章を投稿するたびに自分の感情と向き合うことで、感情を俯瞰的に見る習慣がつき、結果的に自分の感情をコントロールしやすくなると考えています。
他にも、喜怒哀楽それぞれの投稿を見ることができるので、あまりネガティヴな意見を見たくない場合は、「よろこび」や「たのしい」の部分だけ見ていただくことも可能です。

自分の感情がグラフ化される

スクリーンショット 2020-02-07 16.23.19.png
マイページでは、最近自分がどんな気持ちでいるかを把握できる「感情グラフ」を見ることができます。
グラフは「当日」と「過去一週間」の二種類存在しており、他ユーザーの感情を見ることも可能です。
「怒りの感情が多いから減らそう」「もっと嬉しい気持ちを増やしたい!」といったように、日頃の感情を知ることで、自分を変えるきっかけを作ることができるのです。
他にも特定のワードがどのような感情のもと書かれているかを検索できる機能もありますので、ぜひお好きなワードを調べてお楽しみください。

承認欲求から解放される

他のSNSでは「他人から評価されたい」と考える自己承認欲求の強いユーザーが数多くいます。
その原因は、いいね数や(ツイッターで言う)リツイート数が表示されるからでしょう。
SNSに資本主義の要素を作ったことで、多くの人がその数字に囚われるようになってしまいました。
しかし、本来良質なコミュニケーションを築く上で、そういった数字を表示する機能は必要ありません。
現にインスタグラムはいいねの数を非表示にしましたし、ツイッターもいいね機能を失くす話が度々出ています。
そういったこともあり、キドアイラクでは「いいね機能」「シェア機能」「フォロー機能」を導入しないことで、必然的に承認欲求から解放される仕組みに設計しました。
誰かに認められようとするのではなく、常に自分と向き合い、成長しようと前を向き続ける向上心を持ちたい方にオススメのサービスです。

まとめ

全く0の知識から作ったので、ひとまず完成させられたことにホッとしています。
しかし、それ以上に圧倒的な技術不足を痛感しました。
自分が思ったようにできないことも多く、直さなければいけないところは山ほど存在します。
デザインも他所から拝借したものも多くありますから、それも直す必要がありそうです。
何より、自分の頭にあるものを形にする難しさを嫌という程知りました。
ものづくりって大変ですね。

最後にもう一度URLを貼っておきます。
ぜひ一週間ほど使ってみてください。
自分の感情と向き合い、自己分析してくだされば、このアプリの効果を実感していただけると思います。
https://kidoairaku2019.herokuapp.com/

ここまで読んでくださった皆さん、本当にありがとうございました。
エラーがなんども出て大変な時もありましたが、今回の経験を糧に、さらに色んなものを作っていきたいと思います。
その時はまたよろしくお願いします。


xamppからmysql利用時の文字化け問題

$
0
0

恐竜名文字化け問題

mysql_select_result_ng.jpg

show create table テーブル名;コマンドで文字コードを確認。
ラテン語になっている。

mysql_select_result_ng2.jpg

2.解決策

(1).[mysqld]の編集

my.iniファイルの[mysqld]セクションの最後の「## UTF 8 Settings」を探す

変更前

## UTF 8 Settings
#init-connect=\'SET NAMES utf8\'
#collation_server=utf8_unicode_ci
#character_set_server=utf8
#skip-character-set-client-handshake
#character_sets-dir="C:/xampp/mysql/share/charsets"

↓utf-8に関する下記部分をコメントアウトする。

変更後

## UTF 8 Settings
init-connect='SET NAMES utf8'
collation_server=utf8_unicode_ci
character_set_server=utf8
skip-character-set-client-handshake
character_sets-dir="C:/xampp/mysql/share/charsets"

(2).次に[client][mysqldump][mysql]の各最後に次の行を追加する。

default-character-set=utf8mb4

[client] 
# password       = your_password 
#port            = 3306
port            = 3308  
socket          = "C:/xampp/mysql/mysql.sock"
#下記を追記
default-character-set=utf8mb4
[mysqldump]
quick
max_allowed_packet = 16M
#下記を追記
default-character-set=utf8mb4
[mysql]
no-auto-rehash
# Remove the next comment character if you are not familiar with SQL
#safe-updates
#下記を追記
default-character-set=utf8mb4

(3).作成済みテーブルの文字コードの変更

下記コマンドで、文字コードを変更。

ALTER TABLE tbl_dino CONVERT TO CHARACTER SET utf8mb4;

MariaDB [db_dino]> show create table tbl_dino;
+----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table    | Create Table                                                                                                                                                                                                                                                                                                                                                                    |
+----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tbl_dino | CREATE TABLE `tbl_dino` (
  `id` tinyint(3) unsigned NOT NULL AUTO_INCREMENT,
  `dname0` varchar(100) DEFAULT NULL,
  `type0` varchar(50) DEFAULT NULL,
  `n_src1` int(11) DEFAULT NULL,
  `type1` varchar(50) DEFAULT NULL,
  `n_src2` int(11) DEFAULT NULL,
  `type2` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 |
+----------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

MariaDB [db_dino]>

参考url

XAMPPの文字化け回避メモ
my.iniファイルの確認と修正

[Ruby]Dateクラスで日付を扱う

$
0
0

RubyのDateクラスについて

  • RubyのDateクラスを使用することで『日付』を扱うことができます。
# Dateクラスを読み込むrequire"date"# Date.newの引数に年月日を渡して、変数dayに格納day=Date.new(2020,2,22)# dayの出力結果は「2020-02-22」となるputsday# 「sunday?」メソッドは日付が日曜日かどうか真偽値を返すputsday.sunday?

Dateクラスの便利な使い方やメソッドについて、また随時更新していきたいと思います!
ご覧いただきありがとうございました!

悔いの無いキャリアを歩むために

$
0
0

中途でIT業界に堕ちた人の独り言

仕事って何のためにするのだろう?

「遣り甲斐」「お金」「家族」・・・

上記以外にも色々あると思いますが、何かしら目的があってやっていると思います。
目的はなんでも良くて不純で結構。
極論、生きるためであり、それとは別に少しでも楽しさがあれば良いと考えます。
目的が無ければ何処に歩いて行くのか?何故歩くのか?自分は何なのか?とドツボに嵌ります。

今一度、自分が仕事をする目的+楽しさ(楽しみ)は何かを考えてみてください。
人生100年時代と言われる現代。ここが不透明だと活動を継続することは難しと思います。

石の上にも3年?

「ここでダメなら何処に行ってもダメに決まっている!」by古い企業体質の課長様

社会人経験が浅いと、この一言に言いくるめられてしまいますが、そんな事は無いと思います。
ここに居てダメと思ったのなら行動は早い方が良いです。
ダメと思った会社に長居するほど無駄なことはありません。
その間にモチベーションは下がり自身の価値も下がっていくかもしれません。

そもそも、このセリフは年功序列+退職金が確実だった時代の旧世代の言葉です。

時代は変わり待遇の向上は自分で勝ち取っていくスタンスが必要と感じます。
転職回数については比較的大らかになっており、しっかりとした理由があれば問題視はされないと思います。
当たり前ですが一年未満での複数回転職であったりネガティブ要因であることを面接で口にしたらNGです。

信用のできる上司や同僚、同期なりに相談することは大事です。
会社風土にもよりますが待遇改善に繋がるかもしれません。

但し、下記は実施しましょう。どれも欠けてはならない事項と考えます。
1.戦えるスキルを身に着ける(例、簿記・電気工事・構築・プログラミングなど)
2.外部環境の把握(自身の市場価値・保持スキルの優位性調査)
3.自分への投資

上記が欠けているのならば転職はすべきではないです。必ず何処かで頓挫します。
即ち数か月で辞めるという判断には至らないと思います。ブラック企業なら別ですが。。。

異業種からITエンジニアは可能なのか?

人不足が長年続いているIT、飲食、介護に限って求人数は多い印象です。
その三者の中でもITは給与水準が高いので短期的に見ても良いと考えます。

パソコンが使えない人でも高難易度な現場に入ってくるのでほんと誰でもいいような気がします。。。営業の強さですね。
そんな人たちは長続きするのか?答えはNoです。
環境が良ければ続くのですが、寂しいチーム体制だと直ぐに来なくなりますね。

未経験ですと会社都合で案件が決まることが多いと思います。
それにマッチすれば良いのですが、合わないと彷徨う羽目になります。
なので、軸(価値観)はしっかりと持ちましょう。そして、強みを見つけましょう。

一発目の案件や会社では軸も何も無いと思うのですが、要望はある筈です。
これをハッキリと上司や営業に伝えておかないと頭数合わせやキャリアパス無視の配属(異動)となっていきます。
厚顔無恥で言いたいことは行っておく、そして教えてくん教えてちゃんに徹した方が吉です。

彷徨った歩みを簡単に紹介したいと思います。
接客~工事監督;物売りからセメントこねこねまで
---↑非IT---↓IT---
データセンター案件;オペレーションという名の超単純作業
銀行リプレイス案件;機器リプレイス、ユーザサポート
SIerでの運用案件;特化したNW機器の高度な運用
SIerでの構築運用案件;NW機器の構築&運用
インフラ系での構築案件;高度なNW機器の構築&運用
インフラ系での構築案件;高度なSV/NW機器の構築

非ITでは惰性的ルーチンワークが嫌でIT業界に入りましたが軸が無いお陰でブレブレです。
評価されたから「次は高度な現場ね」で、自分のやりたいことは見つけられず仕事をする目的が見つかりませんでした。
そして、運用、構築、移行と幅広く関わってきたのですが何一つ強みと言えるものが無いのです。これは私の能力不足が大きい。

35歳定年説

これは、私のように軸もなければスキルも無い人間が35歳になったとき、徐々に案件アサインが難しくなってくるよ。だと思います。
そりゃそうですよね、自分より若い人たちは遥かにスキルや新しい分野の吸収力が高いんですから。
更には小学校でのプログラミング教育開始、NWベンダー試験の改訂(PythonやJSON追加)、自動化の波・・・
新世代は、論理的思考が備わっており簡単なプログラムなら組めますよって感じが普通になるんですかね。恐ろしいです。

私は現在の流れにしがみ付くことは難しいと思った次第です(笑)

では管理職はどうか?上司達を見ていると成りたいと思えない現実。
役職ついても給料は変わらないで責任だけ重くなる。更に上の役職が付いたら残業代も出なくなる。何だそれ?

強みとは何か?

一人称で戦えるものが望ましいとは思うのですが下記も立派な強みですよね。
「整理整頓が得意」「パワポの資料作成」「会議でのファシリテーション」「コミュニケーション」・・・

日々の業務の中で得意となるものは必ずある筈です。
これらを伸ばしていくことが大事だと考えます。
何故なら新しいことを習得するより、既に備えているものを磨き上げるほうが格段に楽だからです。
非ITの人がいきなりNW構築するより、日々使っているエクセルの改善活動としてマクロを組む方が難易度低いですよね?

価値観の整理

「これはこうするべきだ!」「これはこうでなければならない!」とか譲れない考えがあると思います。

例えば、年間休日は130日以上なければ嫌だ。給与は年齢×1万円が望ましい。とか。

これらはブレてはいけない軸となる要素だと考えます。
それの優先順位を定期的に入れ替えつつ案件の異動先選考や転職を考える。
その際に有効な情報と思いますので脳の片隅にでも置いておいて下さい。

まとめ

1.仕事をする目的を考える。
2.違和感は長期で抱えず相談し解決できなければ転職を考える。
3.但しスキルを1つは身に着け安易な離脱は避ける。
4.異業種からIT業界は敷居は低いが35歳定年説(スキル0で迎えると悲惨)は意識すること。
5.案件をこなしつつ強みの発見と価値観の整理を繰り返す。

IT業界へのへのもへじ

正社員で登用されるものの、客先企業に常駐する特定派遣だったり業務委託で働く形が多数だと思います。
正社員でも自社に殆ど居ないし帰らないとなると何処の会社に居ても同じじゃないのか?
そもそもチームで入っているのに助け合いも会話も無しとなると帰属意識や愛社精神の前に憎悪しか生まれないわけで。

そんな想いの方は少なくなく管理者層に中間層が挙って退職していく。そして休職者も増えている。
求人サイトに登録しとけば山のように届くオファー通知。
企業SEや自社開発らを選ばなけれな、給与額だけ見ていればいい。

このITエンジニアに対する好景気はいつまで続くのか?オリンピックまでが限界とよく言われているが。
再びのバブル崩壊は起こるのか?株価は再び上昇に転じ始めたが。
それを考えると好待遇でエンジニアを迎えた特定派遣主体の企業体力は維持できるのか?

【サンプルコード】JavaScriptでスロットゲームをプログラミング

$
0
0

どうも、UT(@ut_1029)です。ブログ(UTの日常)の紹介です。

JavaScriptでスロットゲームをプログラミングしたサンプルコードを紹介します。

スロットゲームは、JavaScriptのアニメーション勉強に最適でした。

スロットのリールの表示位置をJavaScriptで制御して、回転のアニメーション制御処理がポイントです。

スロット.jpeg

JavaScriptで作成したスロットゲームのサンプルコード

JavaScriptでプログラミングしたスロットゲームのサンプルコードを紹介します。
※HTML + CSS + JavaScriptを1つのファイルに記述しています。

<html><head><metacharset="UTF-8"><title>JavaScriptでスロットゲームを作成</title><style>body{text-align:center;padding:0;margin:0;}ul{list-style:none;}.slot{width:90%;height:500px;overflow:hidden;margin:auto;border:solid1px#333;}.slot-frame{height:500px;position:relative;overflow:hidden;border:solid1px#333;}.reels{width:31%;position:absolute;}.reels:nth-child(1){left:0;}.reels:nth-child(2){left:33%;}.reels:nth-child(3){right:0;}.reel{height:270px;}.reelimg{display:block;width:89%;margin:auto;}</style></head><body><h1>JavaScriptでスロットゲームを作成</h1><divclass="slot"><divclass="slot-frame"><ulclass="reels"><liclass="reel"><imgsrc="/youtube/slot/img/slot1.jpg"></li><liclass="reel"><imgsrc="/youtube/slot/img/slot2.jpg"></li><liclass="reel"><imgsrc="/youtube/slot/img/slot1.jpg"></li><liclass="reel"><imgsrc="/youtube/slot/img/slot3.jpg"></li><liclass="reel"><imgsrc="/youtube/slot/img/slot4.jpg"></li><liclass="reel"><imgsrc="/youtube/slot/img/slot5.jpg"></li><liclass="reel"><imgsrc="/youtube/slot/img/slot1.jpg"></li><liclass="reel"><imgsrc="/youtube/slot/img/slot2.jpg"></li></ul><ulclass="reels"><liclass="reel"><imgsrc="/youtube/slot/img/slot5.jpg"></li><liclass="reel"><imgsrc="/youtube/slot/img/slot2.jpg"></li><liclass="reel"><imgsrc="/youtube/slot/img/slot4.jpg"></li><liclass="reel"><imgsrc="/youtube/slot/img/slot1.jpg"></li><liclass="reel"><imgsrc="/youtube/slot/img/slot3.jpg"></li><liclass="reel"><imgsrc="/youtube/slot/img/slot4.jpg"></li><liclass="reel"><imgsrc="/youtube/slot/img/slot5.jpg"></li><liclass="reel"><imgsrc="/youtube/slot/img/slot2.jpg"></li></ul><ulclass="reels"><liclass="reel"><imgsrc="/youtube/slot/img/slot3.jpg"></li><liclass="reel"><imgsrc="/youtube/slot/img/slot2.jpg"></li><liclass="reel"><imgsrc="/youtube/slot/img/slot5.jpg"></li><liclass="reel"><imgsrc="/youtube/slot/img/slot1.jpg"></li><liclass="reel"><imgsrc="/youtube/slot/img/slot4.jpg"></li><liclass="reel"><imgsrc="/youtube/slot/img/slot5.jpg"></li><liclass="reel"><imgsrc="/youtube/slot/img/slot3.jpg"></li><liclass="reel"><imgsrc="/youtube/slot/img/slot2.jpg"></li></ul></div></div><div><buttontype="button"class="btn-start">start</button><buttontype="button"class="btn-reset"disabled="true">reset</button></div><div><buttontype="button"class="btn-stop"data-val="0"disabled="true">stop 0</button><buttontype="button"class="btn-stop"data-val="1"disabled="true">stop 1</button><buttontype="button"class="btn-stop"data-val="2"disabled="true">stop 2</button></div><script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script><script>(function(global){"use strict";/*
                 * スロットのリール回転速度(実行毎秒数)
                 */varsec=100;/*
                 * スロットのリール情報
                 * ・スロットのリールelement
                 * ・スロットのリール停止フラグ
                 * ・スロットのリール回転数
                 */var$reels=[],stopReelFlag=[],reelCounts=[];/*
                 * 位置情報
                 */varslotFrameHeight=0,slotReelsHeight=0,slotReelItemHeight=0,slotReelStart=0,slotReelStartHeight=0;/**
                 * スロット
                 */varSlot={/**
                     * 初期化処理
                     */init:functioninit(){$reels[0]=$reels[1]=$reels[2]=null;stopReelFlag[0]=stopReelFlag[1]=stopReelFlag[2]=false;reelCounts[0]=reelCounts[1]=reelCounts[2]=0;},/**
                     * スタートボタンのクリックイベント
                     */start:function(){for(varindex=0;index<3;index++){Slot.animation(index);}},/**
                     * ストップボタンのクリックイベント
                     */stop:function(index){stopReelFlag[index]=true;if(stopReelFlag[0]&&stopReelFlag[1]&&stopReelFlag[2]){// 全リール停止したらリセットボタンを押下できるようにする$('.btn-reset').attr('disabled',false);}},/**
                     * 位置情報の初期化処理
                     */resetLocationInfo:function(){slotFrameHeight=$('.slot-frame').outerHeight();slotReelsHeight=$('.reels').eq(0).outerHeight();slotReelItemHeight=$('.reel').eq(0).outerHeight();slotReelStart=5-2;// リールの上下は、半分だけ表示させるための位置調整slotReelStartHeight=-slotReelsHeight;slotReelStartHeight=slotReelStartHeight+slotFrameHeight+((slotReelItemHeight*3/2)-(slotFrameHeight/2));$('.reels').css({'top':slotReelStartHeight});},/**
                     * スロットの回転アニメーション
                     */animation:function(index){console.log('アニメーション','開始',index);if(reelCounts[index]>=5){reelCounts[index]=0;}console.log('slotReelStartHeight',slotReelStartHeight);console.log('reelCounts[index]',reelCounts[index]);console.log('slotReelsHeight',slotReelsHeight);console.log('top',slotReelStartHeight+(reelCounts[index]*slotReelItemHeight));$('.reels').eq(index).animate({'top':slotReelStartHeight+(reelCounts[index]*slotReelItemHeight)},{duration:sec,easing:'linear',complete:function(){console.log('アニメーション','完了',index,reelCounts[index]);if(stopReelFlag[index]){console.log('アニメーション','ストップ',index,reelCounts[index]);return;}// 移動階数をカウントreelCounts[index]++;// スロット回転のアニメーションを実行するSlot.animation(index);}});},};global.Slot=Slot;})((this||0).self||global);/**
             * 読み込み後
             */$(document).ready(function(){/*
                 * スロットの初期化処理を実行
                 */Slot.init();Slot.resetLocationInfo();/**
                 * スタートボタンのクリックイベント
                 */$('.btn-start').click(function(){// スタートボタンを押せないようにする$(this).attr('disabled',true);// スロットの回転を開始Slot.start();// ストップボタンを押せるようにする$('.btn-stop').attr('disabled',false);});/**
                 * リセットボタンのクリックイベント
                 */$('.btn-reset').click(function(){// リセットボタンを押せないようにする$(this).attr('disabled',true);// スタートボタンを押せるようにする$('.btn-start').attr('disabled',false);// ストップボタンを押せないようにする$('.btn-stop').attr('disabled',true);// スロットのリール情報を初期化Slot.init();});/**
                 * ストップボタンのクリックイベント
                 */$('.btn-stop').click(function(){// ストップボタンを押せないようにする$(this).attr('disabled',true);// レールの回転を停止Slot.stop($(this).attr('data-val'));});});</script></body></html>

See the Pen [sample code]javascript slot by UTのCodePen (@ut_1029) on CodePen.

解説は、ブログ(UTの日常)で!

【サンプルコード】JavaScriptでスロットゲームをプログラミング | UTの日常

Rails6 テーブル作成時のmigrateでエラーが出た話

$
0
0

目的

  • テーブル作成を行なった際にmigrateでエラーが出た話をまとめる

エラー内容

  • 下記コマンドでモデルファイルを作成した。

    $rails g model user name:string
    
  • その後、下記コマンドでmigreteを実行した。

    $rails db:migrate
    
  • 下記のエラーが発生した

    [14:50:10]MacBook-miriwo~/workspace/study/rails/tropical_fish_sns_of_rails$ rails db:migrate
    == 20200206055010 CreateUsers: migrating ======================================
    -- create_table(:users)
    rails aborted!
    StandardError: An error has occurred, all later migrations canceled:
    
    Mysql2::Error: Table 'users' already exists
    /Users/admin/workspace/study/rails/tropical_fish_sns_of_rails/db/migrate/20200206055010_create_users.rb:3:in `change'
    /Users/admin/workspace/study/rails/tropical_fish_sns_of_rails/bin/rails:9:in `<top (required)>'
    /Users/admin/workspace/study/rails/tropical_fish_sns_of_rails/bin/spring:15:in `<top (required)>'
    bin/rails:3:in `load'
    bin/rails:3:in `<main>'
    
    Caused by:
    ActiveRecord::StatementInvalid: Mysql2::Error: Table 'users' already exists
    /Users/admin/workspace/study/rails/tropical_fish_sns_of_rails/db/migrate/20200206055010_create_users.rb:3:in `change'
    /Users/admin/workspace/study/rails/tropical_fish_sns_of_rails/bin/rails:9:in `<top (required)>'
    /Users/admin/workspace/study/rails/tropical_fish_sns_of_rails/bin/spring:15:in `<top (required)>'
    bin/rails:3:in `load'
    bin/rails:3:in `<main>'
    
    Caused by:
    Mysql2::Error: Table 'users' already exists
    /Users/admin/workspace/study/rails/tropical_fish_sns_of_rails/db/migrate/20200206055010_create_users.rb:3:in `change'
    /Users/admin/workspace/study/rails/tropical_fish_sns_of_rails/bin/rails:9:in `<top (required)>'
    /Users/admin/workspace/study/rails/tropical_fish_sns_of_rails/bin/spring:15:in `<top (required)>'
    bin/rails:3:in `load'
    bin/rails:3:in `<main>'
    Tasks: TOP => db:migrate
    (See full trace by running task with --trace)
    

原因調査

  • 下記コマンドを実行して現在のmigrateのステータスを確認した。

    $rails db:migrate:status
    
  • 以前にmigrateを実施した際のmigrationファイルのが無いことが判明した。

    [14:52:57]MacBook- 
    miriwo~/workspace/study/rails/tropical_fish_sns_of_rails/db/migrate$rails db:migrate:status
    
    database: tropical_fish_sns_development
    
     Status   Migration ID    Migration Name
    --------------------------------------------------
       up     20200206025324  ********** NO FILE **********
       up     20200206025916  ********** NO FILE **********
      down    20200206055010  Create users
    

解決法

  • 下記コマンドを実行してDBのリセットを行なった。

    $rails db:migrate:reset
    
  • DBの状態を確認した。

    [14:54:33]MacBook-miriwo~/workspace/study/rails/tropical_fish_sns_of_rails/db/migrate$rake 
    db:migrate:status
    (in /Users/admin/workspace/study/rails/tropical_fish_sns_of_rails)
    
    database: tropical_fish_sns_development
    
     Status   Migration ID    Migration Name
    --------------------------------------------------
       up     20200206055010  Create users
    
  • 正常に反映されていることをがわかった。

Viewing all 21655 articles
Browse latest View live