前日の日付を算出し、時刻を設定する
よく忘れるのでメモ
//前日の日付
$previous_day = date("Ymd",strtotime("-1 day" ,strtotime($schedule)));
//それをDateTimeにキャスト
$previous_datetime = new DateTime($previous_day);
//setTimeで時刻を入れる
$deadline = $previous_datetime->setTime(16,00);
サーバーとクライアントとは
プログラミングに関連して当たり前のように使われる言葉に、サーバーとクライアント、という言葉があります。特に説明もなく使われているので当然の知識として見なされていますが、意味がわからないという方もいると思います。
簡単に言うと、どちらもコンピューターのことです。しかしサーバーとクライアントという言い方をするときにはそのコンピューターが果たす役割で区別します。ですから全く同じスペックのコンピューターをサーバーとして使うこともクライアントとして使うことも出来ます。
サーバーとは、クライアントとは、ということを少し説明したいと思います。
サーバーとは
コンピューターをサーバーと呼ぶ時、だいたいそのマシンはインターネットの向こう側にあります。それらサーバーとして働くコンピューターは、特定のサービスをサーブする(提供する)ので、サーブするモノ、つまりサーバーと呼ばれます。
例えば今見ているウェブサイトはウェブサーバーというサーバーが提供している情報を表示しています。ウェブサーバーにはホームページ(ウェブサイト)の本体の情報が格納されています。ウェブサーバーが使えなくなると、そのサーバー上のホームページは見れなくなるのです。
メールを送る際には送信メールサーバーにメールを送ると、そのサーバーが相手先の受信メールサーバーにメールを送ってくれます。メールサーバーが落ちると、メールの送受信ができなくなります。
1つのコンピューターが複数のサービスを提供する場合は、それが複数のサーバーを兼ねていることも少なくありません。同じマシンがウェブサーバーとしてもメールサーバーとしても機能していることがあるということです。
サーバーは単体で動くのではなく、他のマシンからアクセスされて使われることを想定しています。ファイルサーバーはファイルを保存していますが、他のマシンからアクセスされることが複数の異なる人がそのファイルを共有できます。GoogleドライブやDropboxなどは(厳密に言うとファイルサーバーではありませんが)そのようなファイルサーバーを直感的に使いやすくしたとも言えます。
サーバーとして使われるマシンを一般の私達が直接触ったりキーボードを叩いたりすることはありません。技術者であればそのマシンを設置するさいにデータセンターでサーバーにキーボードとモニターを繋いで直接触ることが稀にあります。しかしそのような技術者でも普通は遠隔でクライアントマシンからサーバーに繋いで操作するものです。
買ってきたWindows のマシンをサーバーとして使うことも出来ます。しかしサーバーとして使う時、それを使って自分のメールを見たりウェブサイトを見たりする用途では使いません。
クライアントとは
クライアントとは依頼者という意味ではありません。サーバーとの文脈で語られるときのクライアントという言葉は、個人が使用しサーバーにアクセスするためのコンピューター、端末ということになります。
今このブログを見ているスマホやコンピューターはクライアントです。hatenaというウェブサーバーが提供するブログサービスを閲覧するための端末、つまりサーバーにアクセスするためのマシン、それがクライアントマシンと呼ばれるものです。
ですから簡単に言うと、クライアントとは私達が普段使っているコンピューターやスマートフォンなどすべてがクライアントであると言えます。現在ではほぼすべてのコンピューターはインターネットに繋げて使われるはずです。ですので私達が触って使うことができるコンピューターはすべてクライアントマシンと呼んで良いことになります。
サーバーとクライアントを意識する
これらの表現は単純な概念を表していることがわかりました。サーバーは何かの仕事をするために特化したコンピューターです。クライアントは私達が普段使っているスマホやノートパソコンなどです。
これらを意識する必要があるのは、社内でのネットワークを構成するときや、システム開発をするときです。ネットワークを構成するときには古いパソコンをファイルサーバーなどとして社内ネットワークに使うことがあります。その際には余計なソフトはすべてアンインストールして使いますね。
システム開発ではサーバー上に何らかのプログラムを設置します。そのプログラムにアクセスするのはパソコンなのか、携帯なのか、スマホにインストールされたアプリなのかを意識して作ることになります。そのプログラムにアクセスする可能性のあるクライアントに合わせてどんな情報を処理して返すのかを考えて作る必要があるのです。
単純なことで言えば、パソコンの大画面で表示するウェブサイトの情報と、スマホの画面に表示する情報を変えたりします。クライアントを意識したプログラムということですね。
そのような理由で「サーバー、クライアント」という表現が多用され、かつ当たり前の用語として流通しているのです。
プログラマーはフリーランスの夢を見るか
最近Twitter上で、#駆け出しエンジニアと繋がりたい というハッシュタグが怪しい情報商材の狩場となっていることで話題になっているようです。
エンジニアやプログラマーの養成コースを受講して、初心者でも数ヶ月でフリーランスプログラマーとしてがっつり稼げる、というたぐいの話に引っかかる人が多いとのことです。確かに数十万円かかるコースというのは存在するのを見たことがあります。専門学校のようなところで講師に直接教えてもらうような場合には適切な金額なのかなとは思っていました。
オンラインコースの相場感
しかしオンラインコース=動画を見るだけ、であればもっと安い価格で同様の勉強が出来ます。ドットインストールといった優れたコースが無料で提供されていたりします。Udemyでも毎月のようにセールをやっているので1500円程度で優秀なコースを受講できます。
特に英語ができればなおさらUdemyは素晴らしいコースが多数存在します。学位という形に拘らないのであれば、Udemyだけにお金と時間を使って2年くらいみっちり勉強すれば相当な技術が身につくと思います。私もUdemyのコースをかなりたくさん受講しました。
オンラインコースでフリーランスになれるか
1500円でも40万円でも、その価値は本人が納得するなら問題ないのかとは思います。しかし実態として安易にフリーランスで稼げる、と言った言説に載せられて結局何にもならなかったとしたらそれは残念なことですよね。
オンラインコースを受講しただけでフリーランスとして活躍できるか、と言えばハッキリと無理だと思います。それには理由があります。
どこから仕事をもらえるか
フリーランスが仕事をもらえる先として手堅いのは、元々働いていた会社関係です。実際にはその会社努めを辞めたくてフリーランスになっていることが多いとはいえ、良好な関係を保っていればそこからの仕事は手堅く入ります。発注する会社があなたの能力や信頼性にしっかりとした担保を持っているからです。
フリーランスになってすぐに気づくことは、努めていて毎月定期的に決まった金額が振り込まれることがどれだけ有り難いことが、ということです。新しいクライアントを探す労力、そこと金額や納期や契約の交渉をイチからする労力は大変なものです。黙っていれば仕事が割り当てられて、それに給料がついてくるというのが恵まれていることは辞めてから実感として理解出来るようになります。
ではそもそもオンラインコースだけを修了しただけの自称エンジニアに誰が仕事をくれるのでしょうか。クラウドワークスのようなところでは、単価が非常に安いものが多く見られます。金額の安さを売りにしていてはエンジニアとして先がありません。評価をもらうために一時的に赤字案件に手を付けるということがあるとしても、競争率の非常に高いところで戦って仕事を勝ち得ること、そしてそのクライアントから高評価をもらえるほどに仕事を成し遂げることが本当にできるでしょうか。
技術以外の経験や交渉
フリーランスということは、自分で金額や納期、作業範囲などを区切って交渉することが必要です。しかしシステム開発のような案件ではそもそもクライアントが自分の必要としているシステムやプログラムを上手に説明できないことがほとんどです。
適切な相場で作業範囲を区切ったり、ヒアリングから必要としている事柄を導き出したりするのは一朝一夕にできることではありません。オンラインコースの課題では明確に何をどのようにして、どんな完成形が求められているのかが明確です。しかし実際のプロジェクトでは、完成形を自分でクライアントから聞き出して絵を描いてあげるところからスタートするのです。
課題でもなく、自分で作り出す新しいサービスでもありません。クライアントが欲しい物が何か、それを聞き出して形にするには泥臭い経験が必要なのです。
トラブルシューティング
多くのプログラマーが自分の書いたプログラムに満足していません。方法論として美しいプログラムの書き方や設計の仕方、みたいなものはみんな模索し、それを実行しようと最善の努力を払います。しかし現実には納期が迫っていたりして、簡単で雑なプログラムをとりあえず書いて、それがそのまま本番に使用されるということもあります。
中にはセンスがあって学んだ技術をどんどん応用できる優秀な方もいることでしょう。堅牢な設計を最初から考えられる方もいると思います。しかしプログラムには癖があり、同じプログラミング言語でもマイナーバージョンが少し違う環境で動かそうとするだけでエラーが発生したりすることもあります。
そんなときそのプログラミング言語での経験が、使っているOSの経験が役に立つことが多いのです。エラーメッセージを見ただけでピンとくることが増えてきます。同じ問題で苦労したことがあるからです。
どこで問題が生じているのかはエラーメッセージだけを見るとミスリーディングなこともあります。知らないと解決策にたどり着かないような問題もたくさんあります。
オンラインコースではまずそのような問題が起きないように生徒の環境をちきんと整えて、本来学習すべき技術を効率的に学べるようになっています。ですから理不尽なトラブルが発生すると、それに対処できないケースが多いのではと考えます。
プログラマーは別のプログラミング言語はすぐに使えるようになるのか?
プログラミング言語の種類はたくさんあります。それぞれに向き不向きがあったりしますが、ゼロスタートであればいくつかの選択肢のどれを選んでも問題ない場合も少なくありません。ではプログラマーであれば、別のプログラミング言語はすぐに使えるようになるのか?
簡単な処理を書くだけならすぐにできる
前に書いたように実際の言語(日本語とか英語)ほどにプログラミング言語間の差異はありませんので、1つ使えるようになれば別の言語でプログラムを書くことのハードルはものすごい高いわけではありません。簡単な処理であれば新しい言語でも数時間学べば書けるようになるでしょう。
言語によっては書き方が全く同じになる、もしくは使用するキーワードが差し替わるだけという場合もあります。例えば以下の2つは別々の言語で書いた同じ処理です。
Javascript
function getDisplayableAmount($num){ return $num + "個"; }
private function getDisplayableAmount($num){ return $num . "個"; }
微妙に違うところもありますが、ほとんど同じです。
複雑になってくると調べ物が増える
しかしそれと、実際に役に立つアプリケーションやシステム開発を完遂できるかどうかは別の話です。プログラミング言語にはそれぞれ似て非なるところがあります。癖もあります。エラーが出やすい箇所や書き方も異なります。
例えば
if( $bar == 0 )
と
if( $bar === 0 )
では微妙に意味が異なる場合があります。後者の書き方は存在しない言語もあり、その場合このように書くとエラーになります。
よくあるエラーメッセージも言語によって異なります。その言語でプログラムを何度も書いていると、よくあるエラーに慣れてきて問題の箇所や原因をすぐに突き止められるようになります。
ある言語では特定の処理を行う方法として書かれるプログラムの記述が、別の言語だとメモリを食いすぎるため推奨されないということもあり得ます。
そのため得意な言語ならスラスラと書けるところが、エラーや最適な書き方を調べたりする時間が雪だるま式に増えていくのです。
結局経験がモノを言う
そういうわけで、基本的には新しいプロジェクトに携わる時に新しい言語をわざわざ選ぶことは避けたいというのが実情です。自分の得意で経験が豊富な言語を選ぶことが最も効率が良いからです。
時には何か理由があって新しい言語を使うこともあるでしょう。その言語を習得したいとか、どうしてもそれで無いと困る場合です。しかし新しい言語が得意と言えるようになるには、いくつもの産みの苦しみを経験しなければならないことも知っています。そうした経験を経て、プログラマーは新しい言語を身に着けていくのです。
プログラミング言語とは
プログラミング言語、という言葉があります。JavaとかPHPとかRubyとかC言語とかいろいろな「言語」と呼ばれるものが存在します。これは一体なんのことなんでしょうか。
「言語」
通常人間の世界で「言語」といえば、他者とコミュニケーションを取るための手段です。日本語で話せば日本語を話す人と会話ができ、日本語で手紙を書けば日本語を読める人に意思を伝えることが出来ます。
プログラミング言語とは、人間がコンピューターに意思を伝えるための言語、あるいは命令の書き方のルールのようなものです。
コンピューターが命令を処理するにはマシン語という人間がみても意味が不明な数字の羅列のようなものが必要です。しかしそれを人間が直接書くのは難しいので、もう少し意味がある書き方をしたものをマシン語に変換して使います。その意味がある書き方というのがプログラミング言語です。
例えば以下にあるのはPHPというプログラミング言語で書かれたプログラムの一部です。
if ( ! function_exists('is_loaded')) { /** * Keeps track of which libraries have been loaded. This function is * called by the load_class() function above * * @param string * @return array */ function &is_loaded($class = '') { static $_is_loaded = array(); if ($class !== '') { $_is_loaded[strtolower($class)] = $class; } return $_is_loaded; } }
こちらはJavaScriptという言語の例です。
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
次のPythonの例です。
def generate_upsert_queries(data_item): upserts = {} for table in data_item: keys_str = "" for key in data_item[table]: keys_str = keys_str + key + "," keys_str = keys_str[:-1] values_prepared_str = "%s," * len(data_item[table]) values_prepared_str = values_prepared_str[:-1] # deleting the last comma
どれも全く意味がわからないと思うかもしれません。しかし
003D 02E1 01AB 039E
のようなものよりはまだいくらか意味を成す単語が見えるのではないでしょうか。
プログラミング言語にはそれぞれ書き方の「作法」のようなものがあります。例えば上の2つの言語では、行の終わり(右端)にセミコロンがあります。一番下のPythonにはそれがありません。
:(コロン)が意味するものの、{}(波括弧)が意味するものに違いがあります。しかしいずれの場合も、最終的にマシンに行って欲しい処理を書く書き方のルールに過ぎません。
プログラマーはどの言語を使うかをどうやって選ぶのか
プログラマーに成ればどんなプログラミング言語も自由に使いこなせるわけではありません。英語を話せる人が自動的にロシア語を話せるわけではないのと同じです。
逆にプログラミング言語を一つも使えなえれば、そもそもプログラマーとは呼べないでしょう。
使う言語の選び方ですが、まず第一にその言語か似た言語を知っている、ということが必要です。ある程度一つの言語に精通すると、別の言語の習得は外国語よりも遥かに容易です。コンセプトはだいたい同じなので、書き方のルール(コロンを付けるとか、変数名に$を付けるとか)が分かれば、ネットで検索しながらも新しい言語を比較的すぐに使い始める事もできます。
すでに稼働しているプロジェクトに加わる場合には、そのプロジェクトで使用している言語に合わせることが必要です。できない人が割り当てられることはまず無いので、それほど心配する必要はありません。
自分で選択できる場合には、やろうとしている作業、つまりコンピューターに与えようと思っている命令の種類によって、向き不向きの言語というものもあります。
例えばウェブサイトでの処理をプログラムしたい場合に、C言語を選ぶのは効率的ではありません。もっとそれに向いている言語がたくさんあるからです。向いている、というのは書くプログラムのコード量が短くて済むとか、その言語でその作業をする場合に人員を確保しやすいかなどが関係します。
C言語でウェブサイトの処理をさせることは可能でしょうが、一般的で無いが故にそれを使えるようにするための設定や道のりがRubyやPHPなどと比べて何倍にもなります。
機械学習をするという場合にはRとかPythonとかを選ぶと、すでにそのためのライブラリーと呼ばれる機能群が充実しています。誰かがすでに作った車輪を再発明する必要がなくなり効率的です。
携帯で動くアプリを作りたいのであれば、AndroidとiOS両方一度に作れるDartベースの仕組みを使うのが楽です。でもAndroidとiOS別々に作ってでも少しでもサクサク動くということを優先する場合は、それぞれの端末OSに最適化された言語で別々に作るということもあり得ます。
このように言語の選択は、得意であるか、何を目的とするかによって最適な選択が変わってくるのです。
プログラミングに必要なマシンのスペックは?
プログラミングにはどんなコンピューターが必要でしょうか、という質問を受けることがあります。基本的に何でも出来る、というのが答えではあるのですが、気にするポイントは無いことはありません。
MacかWindowsか
端的に言えば、お金に余裕があればMacのほうがオススメです。Macなら基本的にショボいスペックのマシンが(高いだけあって)ないので、今新品で買えるMacならたぶん何でも十分のスペックを備えていると思います。
Windowsでももちろん問題ありません。マシンそのものの性能というよりはWindows 10はWindows UpdateというOSの更新が頻繁に必要なので、使う通信が遅いとストレスになることが多い気がします。
Macの良いとこ
コマンドラインのターミナルが最初からついているため、Linuxのコマンドが使えること、これが一番だと思っています。
MacはLinuxベースに作られているので、Linuxのコマンドがだいたいそのまま使えます。ウェブアプリケーションでは、最終的にLinuxのシステムに本番環境を作ることが多いので、本番環境を意識したファイルやディレクトリの構造を作れるのはありがたいです。
Macの悪いとこ
周辺機器をつなぐためのポートがType-Cが2つだけ、とか非常に少ない。
MacだとApple社の意向でUSBが無くなったりしたので、以前に使っていたUSB機器をそのまま使おうとするとアダプタを必要とするようになりました。
そのため単体で置いてあるとシンプルなデザインでスマートな感じがしますが、いろいろな周辺機器を使うためにつなごうとするとタコ足のようなアダプターとかにたくさんの周辺機器のケーブルが刺さっているというブサイクで使いにくい感じになります。
総じてそのために余分に結構お金がかかります。またApple社の気まぐれで次世代にはガラッと変わったインターフェースになる可能性もあります。
Windowsの良いとこ
安価で手に入ること、周辺機器なども含めて選択肢が多いことです。ソフトの種類も圧倒的に多いですし、資料として送ってくるExcelとかをネイティブの環境で開けるのもありがたいことです。
最終的な本番環境がWindowsなら、開発もWindows一択です。
Windowsの悪いとこ
Windows Updateが頻繁にあり、インターネット回線が遅いとかハードディスクがSSDでは無い時とかに動作が遅くなりストレスを強く感じます。
何かをインストールするとデフォルトのフォルダが、「Program Files」とか「Application Data」みたいなスペースがあるフォルダにインストールされたりします。コマンドからそれを使いたい場合に面倒です。
コマンドが貧弱で、コマンド・プロンプトではLinuxの代替になりません。Linuxで作る本番と似たような環境を作りたい場合に、一致させることができない(Linux OSだけでできることができない)のがストレスです。
ノートかデスクトップか
スペースの関係でノートが良いのでは無いかと思います。手が腱鞘炎気味とか、絶対にその場から動くつもりが無いのであればデスクトップのほうが安くて頑丈で、良いキーボードやマウス(とかトラックボールとか)を使う余地があるので、デスクトップのほうが良いでしょう。
総じてデスクトップのほうが快適に使えて疲れも少ないと思いますが、実際にはスペースの問題でノートパソコンを使うことになるのではないでしょうか。
スペックを見るポイント
細かく言うときりがないので、2つだけポイントを絞りました。ハードディスクとメモリです。CPUは動画とか3D編集のような処理をしないなら、良いCPUを入れたとしてもほとんど違いがわかりません。
ハードディスク
赤で囲んだところがハードディスクです。ここは必ず「SSD」と書いてあるものを選んでください。一見値段が高くて容量が大幅に少ないので損な印象を受けます。しかし起動や使用時の速度が体感で数十倍違います。ここだけは絶対にケチってはなりません。
メモリ
緑で囲んだメモリの部分は、この例ではいずれも4Gbと成っています。少なくとも増設して8Gbくらいは欲しいかなと思います。CPUよりもメモリにお金を掛けたほうが処理が早く感じます。
まとめ
ハードディスクとメモリに気をつければ何でも良い、というのが結論です。
わざわざプログラミングのために新しいのを買う必要もなく、気に入ったマシンがあればそれを使うのが良いと思います。個人的には買い換えるとしてもMacを第一候補に考えますが、挙げたような不満もありますので人それぞれに選ぶのが良いのかなと思います。
プログラマーは英語が必要?
これもよくある疑問の一つだと思います。英語ができないとプログラマーには成れないのでしょうか?
結論から言うと出来たほうが有利ですが、出来なくて困ることはあまり無いと思います。
英語ができなくても良いわけ
一般的に仕事で使う分野、趣味で使う分野いずれも日本語で調べ物などがしっかりとできているからです。プログラミングの分野には「枯れた」技術、という表現があります。それは悪い意味ではなく、長いこと使われ続けているので地味だけど堅牢である、安定しているという意味です。この「枯れた」技術を使ってプログラミングをすることが多いわけで、その場合は大抵日本語しか理解できなくて困ることはありません。
書籍も日本語でしっかりと解説されたものが豊富に手に入ります。その技術を扱ったウェブサイトを日本語で容易に見つけることが出来ます。エラーメッセージを検索すればその意味や解決方法を日本語で見つけることができるでしょう。
会社や学校でチームとしてプログラミングをするのであれば、十分な日本語のドキュメント類もあるはずですし、教えてくれる人もたくさんいます。
つまり国内の環境でよく使われている技術であれば、日本語で調べたり聞いたりすることが容易なのです。
英語ができると良いこと
とはいえ、英語が得意だとメリットもたくさんあります。
関数名などの英語の意味がピンとくる
現在のプログラミングは、用意されている機能のリストから必要なものをピックアップして組み合わせていくというやり方が一般的です。それらを関数、またはメソッドと呼びます。数学の1次関数とかとはまったく違うものです。そんな関数名は大抵は英語の動詞です。
例えばこんなプログラミング言語の一つJavaのドキュメントを見てください。
docs.oracle.com
見方はともかく、appendというメソッドがズラリと並んでいます。
appendとは「後ろに追加する」という意味ですが、その英語の意味を知っていると見ただけでそのメソッドが何をするものかピンときます。そうでないと説明を読んで自分が求めているものかどうかを調べないといけません。些細なことですが、チリも積もればで知っているのとそうでないのに結構差が出てきます。
自分で付ける変数名、関数名も英語がほとんど
関数というのは自分でも作ります。たくさんつくります。その際には英語で命名することが一般的です。
const STATUS_ACCEPTED = 1; const STATUS_NOT_ACCEPTED = 0; const STATUS_PENDING = 10; const STATUS_KARIYOYAKU = 99; function isBooked($num){ if ($num <= 0) return true; else return false; }
これらSTATUS_ACCEPTEDとかisBookedとかは自分でつけた名前です。is何々とか、set何々のようなよく使われる決まった表現もありますが、毎回考えるのも辛いところです。
ちなみにisBookedのBookは「本」ではなく「予約する」という意味の英語です。これも知らないと何をする機能なのかピンとこないでしょう。
日本の開発者チームではSTATUS_KARIYOYAKU(ステータス仮予約)みたいな変数名もよく見かけます。英語を調べても他の開発者に伝わらないくらいならローマ字で、というのもアリだと思います。ただ多用すると英語と混ざってくるので鬱陶しくなります。
エラーメッセージなどは英語の場合がほとんど
NullPointerExceptionというよくあるエラーの画面です。昔は「ぬるぽ」「ガッ」というのが流行りました。
このように大抵のエラーメッセージは英語で出てきます。冷静になれば英語ができなくても調べ方は容易ですが、英語アレルギーがあると、毎日のようにこんなメッセージを見るのは辛いでしょう。
新しい技術は英語情報がほとんど
実際に困ることがあるのはこの理由でしょう。新しい技術を使いたい場合には、英語のドキュメントしかない場合ばかりです。最新の技術を使ったり、その開発チームに質問したり、自分で解決できない問題を調べたりするのには英語が必要です。
英語はできるにこしたことはない
そういうわけで英語ができることはプログラマーにとってアドバンテージであることは間違いありません。特に読めること、次に書けることが大きな武器になります。
「なでしこ」のような日本語プログラミング言語以外では基本的に半角英数字でコードを書くわけですから、英語の文章ではありませんが英語のようなものが画面にびっしり書いてあるというのを見るのには慣れてくると思います。
苦手意識を持たずに使っていく、読んでいくのが良いと思います。
ちなみに日本人の書いたプログラムの中で使われている英語の変数名、関数名にスペルのミスが多いのもご愛嬌です。
adressとか、telefonとか、見たことがあります。