俺の開発大作戦

Linux, Mac, Windows10 で 迷走する1開発を進めていく備忘録5

よく使う Github のコマンド備忘録

自分は、もはやGitHub が無い生活は考えられないくらいこのサービスの恩恵を受けているが、日常的に使わないコマンドはいつもうろ覚えで、ネット検索にお世話になっている。いい加減おぼえろやと自省して、いつも忘れがちになるコマンドをまとめておく。

1. ローカルリポジトリを作成してリモートに push

まずはローカルレポジトリを作成したい場所までターミナル上で移動して、'git init' を実行。続けて、普通に 'git add' から 'git commit' まで実行してしまう。(ファイル数0から始める場合は、'git add' 前に適当なファイルを作っておく。)

% git init
% git add .
% git commit -m "適当に first commit などのコメント"

次に push 先となるリモートのリポジトリをGitHub上で作成し、ローカルからアドレスを指定して紐付けを行う。(アドレスの指定は SSH で行うのがお勧め。push の度に、ユーザ名とパスワードを入力する手間が省ける。但し、事前にローカル環境で公開鍵と秘密鍵のペアを作成し、このうち公開鍵を GitHub に登録しておく必要がある。)アドレスは、GitHub のレポジトリ毎のページに記載があるので、それをコピペ。

% git remote add origin 紐付けするリモートリポジトリのアドレスを 'HTTPS' または 'SSH' で指定

最後に 'git push' を実行。実行時に、'-u' または '--set-upstream' のオプションをつけることで push 先のブランチがトラックされ、これ以降 push や pull のデフォルトの対象先として設定できる。

% git push -u origin master
% git push --set-upstream origin master

2. commit を安全に取り消す

'git reset' では、commit が削除されてもはや最初から無かったことになってしまう。これは、かなり危険なのであまり多用したくなく、作業がかなり進んだ段階では、'git revert' だけを普段使うようにしている。

- ID を指定して取り消す場合、
% git revert <commit ID>
- 直前の commit を取り消す場合、
% git revert HEAD

'git revert' 自体の変更履歴が残るので、それ自体取り消してまた 'commit' 後の状態に戻れたりと、作業の取り返しが何度でも可能。既にリモートに 'push' した後の 'commit' を取り消した後は、pushも忘れずに。('git revert' 自体が、新しい 'commit' の追加になるので、 '-f' オプションは不要。)

% git push origin master

なお、直前より前の 'commit' を取り消すと、その後の 'commit' の内容に同一ファイルの変更が含まれる場合などにコンフリクトが発生し、カオスな状態に陥り易くなるため、直前以外の 'revert' を多用する際は注意したい。

3. ローカルの変更を破棄

ローカルで幾つか変更を加えて save するものの、何かモヤモヤして git に展開する前に元に戻したくなる時がたまにある。そんな時に使うコマンド。

- ファイル名を指定して一つずつ変更を破棄する場合、
% git checkout <filename>
- 全てのファイルの変更を破棄する場合、
% git checkout .

まあ、ひとまずこんなところで・・・。まだまだ 'merge' だとか'rebase' だとか色々あるが、機会を見つけて本ページ内に追記していきたい。

macOS Mojave で apache2.4 + php7.2 環境構築

macOS の Mojave が出て暫く経過したが、巷で大きな混乱もなかったので、ダークモードを体験したくて、ワクワクテカテカ(死語)しながらアップグレードを行った。(一応、バックアップは取ったし、ドンと来い。)

アップグレード後は apache2 の設定が言わずもがなながらデフォルトに戻ってしまったので、前々回記事および前回記事の手順で php7.2 を Homebrew で再インストールし、周辺の環境を再セットアップした。だが、同じ様に設定しても、ブラウザからページを開くと、'ERR_CONNECTION_REFUSED' が出てローカルのページが立ち上がらない。

apache の起動に失敗しているようなので、'sudo apachectl -k start' コマンドで状態を探ることに。

% sudo apachectl -k start
httpd: Syntax error on line 177 of /private/etc/apache2/httpd.conf: Cannot load /usr/local/Cellar/php/7.2.10/lib/httpd/modules/libphp7.so into server: dlopen(/usr/local/Cellar/php/7.2.10/lib/httpd/modules/libphp7.so, 10): no suitable image found.  Did find:\n\t/usr/local/Cellar/php/7.2.10/lib/httpd/modules/libphp7.so: code signature in (/usr/local/Cellar/php/7.2.10/lib/httpd/modules/libphp7.so) not valid for use in process using Library Validation: mapped file has no cdhash, completely unsigned? Code has to be at least ad-hoc signed.\n\t/usr/local/Cellar/php/7.2.10/lib/httpd/modules/libphp7.so: stat() failed with errno=22

どうやら、Homebrew でインストールしたphp7.2 のモジュールが Mojave 標準のapache に適していないためエラーになっているようだ。

色々ネットで情報を探っていたら、Github の Homebrew ページ内に本問題がトピックス 'PHP7.2 module fails to load in macOS Mojave (14.2) #32436' としてあがっていた。

上記リンク先のページにて、pratiksahu氏より本問題の解決方法として、Mojave 標準のApache を止めて、代わりに Homebrew のapache をインストールして起動する手順が紹介されていたので、早速実践してみることに。

まずは、Mojave 標準の apache を止めた後、Homebrew のapache インストールから。

% sudo apachectl stop
% brew install httpd

無事、インストール後は、Mojave 標準 apache の自動起動を止めるコマンド実行。

% sudo launchctl unload /System/Library/LaunchDaemons/org.apache.httpd.plist

Homebrew の apache 設定ファイル (/usr/local/etc/httpd/httpd.conf) を設定

...
LoadModule php7_module /usr/local/lib/httpd/modules/libphp7.so // php7.2 を有効化。(Homebrew の案内に従い、モジュールの実体がある場所ではなく、シンボリックリンクが張られている場所のパスを追記。)
...
Listen 80 // Homebrew 版 apache のデフォルト値は'8080'。一般的なポートで良い場合は変更。
...
DirectoryIndex index.html index.php // index.php を追記。
...

ひととおり設定して、'sudo apachectl start' でapache を起動するも、何故か拡張子.php のファイル上で PHP が実行されず、phpのソースコードがそのまま WEB 上に表示されるだけ。色々と試行錯誤した結果、PHP公式ページこのページなどを参考にしながら、拡張子.php のファイル上で確実にPHPが実行されるように、次の内容を /usr/local/etc/httpd/httpd.conf の最後に追記。すると、突然正常に実行されるようになった。

<FilesMatch \.php$>
    SetHandler application/x-httpd-php
</FilesMatch>

最後に、次回起動から Homebrew 版 apache を自動起動するためのコマンド実行。

% brew services restart httpd
Stopping `httpd`... (might take a while)
==> Successfully stopped `httpd` (label: homebrew.mxcl.httpd)
==> Successfully started `httpd` (label: homebrew.mxcl.httpd)

apache を再起動後、phpinfo(); 実行ファイルを開き、無事 Mojave 上で php7.2 が動作していることを確認。

なお、Mojave 標準の apache から Homebrew 版の環境を移した結果、環境設定のためのファイル群が別の場所に移動したため、今後細かい設定を実行していく前に状態を整理。

maxOSX標準版 apache Homebrew 版 apache
ドキュメントルート /Library/WebServer/Documents /usr/local/var/www
httpd.conf /etc/apache2/httpd.conf /usr/local/etc/httpd/httpd.conf
apachectl /usr/sbin/apachectl /usr/local/bin/apachectl(シンボリックリンク)
httpd-vhosts.conf /etc/apache2/extra/httpd-vhosts.conf /usr/local/etc/httpd/extra/httpd-vhosts.conf

前回 HighSierra で実施したバーチャルホストの設定等、基本的に編集する内容は同じだが、編集対象のファイルが場所とともに変わるので、混乱しないようにしたい。

macOS HighSierra で バーチャルホストの設定

前回に続き、MacBook Pro のWeb開発周りの設定を更に進めていく。現在、当ブログを動かす手製の CMS や従業員が参加する CGM サイトなど、公私にわたって複数のサイト管理を行っているため、バーチャルホストの設定は欠かせない。

というわけで、/etc/apache2/httpd.conf の設定から。まずは、下記のコメントアウトを外してバーチャルホストを有効にする。

...
# Virtual hosts                           
Include /private/etc/apache2/extra/httpd-vhosts.conf // 行頭の「#」を外す。
...

続けて、.htaccess から mod_rewrite が使えるように、該当する行のコメントアウトも外しておく。

...
LoadModule rewrite_module libexec/apache2/mod_rewrite.so // 行頭の「#」を外す。
....

次に、さきほど有効にした /etc/apache2/extra/httpd-vhosts.conf を編集して、バーチャルホストの詳細設定を行う。

一つのホストにつき、以下の内容を1セットとして設定を書き進める。

<VirtualHost *:80>
    ServerAdmin contact@kobachan.biz
    DocumentRoot "コンテンツ配置場所を絶対パスで指定"
    ServerName kobachan-biz
    ErrorLog "/private/var/log/apache2/kobachan-biz-error_log"
    CustomLog "/private/var/log/apache2/kobachan-biz-access_log" common

  <Directory "コンテンツ配置場所を絶対パスで指定">
     Options FollowSymLinks
     AllowOverride all
     Require all granted
  </Directory>

</VirtualHost>

'AllowOverride' を 'all' で設定しないと.htaccess の設定が有効にならないので注意。

'/etc/hosts' に上で設定した ServerName を追記し、apache を再起動してアクセス確認。

...
127.0.0.1 kobachan-biz
...
% sudo apachectl restart

バーチャルホスト URL 'http://kobachan-biz/' で無事ページが開くことを確認。

これで、無事 macOS のlocalhost環境 でマルチに開発や試験を進める環境が構築できた。あとは、ソースを github で管理し、ローカルからpush 後に本番環境に自動デプロイする仕組みを整えて終了。

macOS HighSierra で PHP7.2 をセットアップ

新しくアサインされた業務の用途で、会社より新しい MacBookPro を購入して貸与してもらえることになった。というわけで、到着後さっそくマニアックに、ターミナルのシェルを zsh に変えたり、.zshrc やら .vimrc をホームに置いたり、テキストエディタに Visual Studio Code を入れたりと、色々自分好みの環境設定を済ませたが、ついでにWebやアプリの開発環境も整えようと思い立ち、早速セットアップしていくことに。(ちなみに、本作業時の macOS は HighSierra。)

まずは、ベースの Web 開発環境で、Apache と PHP から。デフォルトでインストール済みのものをヴァージョンチェック。

% php -v
PHP 7.1.16 (cli) (built: Mar 31 2018 02:59:59) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies
% httpd -v
Server version: Apache/2.4.33 (Unix)
Server built:   Apr  3 2018 23:45:11

Apache は特に触らずにそのままにすることに。一方、PHP は、さくらインターネットをはじめ、利用中のクラウドサービスが今後 7.2 に切り替えるとアナウンスしているので、Homebrew で 7.2 をインストールすることにした。

インストールする際の名称をチェック。

% brew search php7.2
==> Formulae
php@7.2

上で調べた名前で、インストール開始。

% brew install php@7.2

ターミナルを再起動して、再びヴァージョンチェック。無事に 7.2 がインストールされたことを確認。

% php -v 
PHP 7.2.10 (cli) (built: Sep 14 2018 07:07:08) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.10, Copyright (c) 1999-2018, by Zend Technologies

続いて、/etc/apache2/httpd.conf を編集して、Apache2 のPHP環境まわりのセットアップ。

% sudo cp /etc/apache2/httpd.conf /etc/apache2/httpd.default.conf
% sudo vi /etc/apache2/httpd.conf

追加したPHP7.2 のモジュールを読込むための文を追記して、

..
LoadModule php7_module /usr/local/Cellar/php/7.2.10/lib/httpd/modules/libphp7.so
..

すかさず構文チェック。'Syntax OK' と出たら、Apatch を再起動。

% apachectl -t
Syntax OK
% sudo apachectl restart

localhost に phpinfo()関数実行ファイルを置いて、apache2 で動作している PHP の動作確認。PHP7.2 が動いていればOK。

<?php
phpinfo(); 
?>

最後に 'http://example.com/index.php' というURL を ''http://example.com/' というようにディレクトリパス指定だけで開けるように、再び /etc/apache2/httpd.conf を編集。

...
DirectoryIndex index.html index.php // index.php を追記。
...

ひとまずここまでにして、次は ヴァーチャルホストまわりの設定を行う。

JQuery の ajax で POST を非同期で送る

web ページからサーバにリクエスト情報を送る際に HTTP GET / POSTメソッドを使う機会は非常に多いが、通常この処理を行うと、サーバサイドで情報を受け取ってレスポンスを返すためのページを読み込むことを余儀なくされる。

一方、ページのリロードを伴わずに非同期でリクエストだけ送りたい場面も生じるが、この場合は、JQuery の ajaxメソッドで を使用すれば割と容易に実装ができてしまう。というわけで、さっそく手順を備忘録として記したい。

1. jQuery を読み込む

まずは基本中の基本から・・・。実装したいページ内で、<script> タグを使いオプションの src 属性で読みこませる JQuery の URI を指定する。

URI は予め本家から入手して自サーバ内に設置しておいた場所を指定する方法や、google のCDN(content delivery network : 配信用に最適化されたネットワーク)など外部にホストされている JQuery のアドレスを指定する方法がある。

'保管した場所から読み込み
<script src="/保管場所/jquery-ヴァージョン.min.js"></script>

'google の CDN から読み込み
<script src="//ajax.googleapis.com/ajax/libs/jquery/ヴァージョン/jquery.min.js"></script>" 

ヴァージョンは1.x系、2.x系、3.x系があり、それぞれサポートするブラウザの範囲が異なる。2.x系以降はIE9以降しかサポートしていないため、サービス対象にIE8以下が含まれている場合には、1.x系を選択する。

なお、CDN からの読み込みを選んだ場合、サービス障害等で読み込むことができない不足の事態に備え、代わりに自サーバに配置した jQuery を読み込むように以下のように記述しておくと良い。

<script src="//ajax.googleapis.com/ajax/libs/jquery/ヴァージョン/jquery.min.js"></script>
<script>window.jQuery || document.write('<script src="/保管場所/jquery-ヴァージョン.min.js"><\/script>');</script>

また、読み込む場所は、ページの読み込みを優先したい場合は、冒頭の<head>~</head>タグ内ではなく、<body>〜</body>タグの最後に記述するのが今流だ。

2. POST フォーム の通常 submit を無効化

続いて form タグで普通にPOST のフォームを作り、その後通常の同期通信型 submit が行えないようにする。submit 無効化の方法については、javascript のsubmit イベントで、'return false'を使ったり、'preventDefault()'を使う方法があるが、当方環境では、これらの方法をとると、連続してsubmit した場合に2回目で無効化が解除されてしまっていて通常の submit による リロードが発生してしまう事態に何度か直面したため、別の方法をとることにしている。例えば、form タグの action属性 に 'javascript:void(0);' を指定して、戻り値をundefined(未定義)として submit を無効化する方法など。以下はその例。

<form action="javascript:void(0);">
 ・
 ・
 ・
</form>

あるいは submit ボタンの代わりに、aタグによる擬似ボタンを作るなど。但しこの場合も、'href' に 'javascript:void(0);' を指定してaタグ本来の動きを止める必要がある。

3. Jquery で onClick イベントを作成

通常の submit を無効化したら、いよいよ JQuery の ajaxメソッドで非同期通信の処理を onClick イベントで書いていく。テンプレート的な書き方は以下のとおり。

<form id="test" action="javascript:void(0);">
 ・
 ・
 ・
<input type="submit" />
</form>

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script type="text/javascript">
$(function () {
  $('input#test').click(function () {

    // 一括してフォームデータを取得
    var formData = $('#test').serialize();

    console.log(formData);
      $.ajax({
          url: "test.php",  //POST送信を行うファイル名を指定
          type: "POST",
          data: formData  //POST送信するデータを指定({ 'hoge': 'hoge' }のように連想配列で直接書いてもOK)
      });
  });
});
</script>

これでページのリロードを挟まずにPOST送信が非同期で行える。

4. POST 成功した後に、POSTした内容でページの一部を更新

3. で使用したajaxに「done」メソッドを付けると、POST送信が成功した場合に新たな処理を実行できる。また、「done」メソッドには、指定した引数にPOSTから渡されたデータを格納できる。

この「success」オプション内で、 '$(object).text()' や '$(object).text()', '$(object).load()' などの非同期型の JQueryメソッドを記述することで、POST した内容に応じながら一部ページの更新をリロードなしに実行できる。

以下は、$(object).text() を使用した例。

<form id="test" action="javascript:void(0);">
 ・
 ・
 ・
<input id="dummy" type="text" name="dummy" /> 
<input id="test" type="submit" />
</form>

<div id="sample">何か記入してください</div>

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script type="text/javascript">
$(function () {
  $('input#test').click(function () {

    // 一括してフォームデータを取得
    var formData = $('#test').serialize();

    console.log(formData);
      $.ajax({
          url: "test.php",  //POST送信を行うファイル名を指定
          type: "POST",
          data: formData  //POST送信するデータを指定({ 'hoge': 'hoge' }のように連想配列で直接書いてもOK)
      }).done(function(data) {
          $('div#sample').text(data2);
      });
  });
});
</script>

蛇足ながら、実際に動かしてみる場合の参考に 'test.php' の例も。

<?php
$dummy = $_POST['dummy'];
if (is_null($dummy)){
  echo "何か記入してください";
}elseif (trim($dummy)==""){
  echo "空白です";
}else {
  echo "あなたは、\"" . $dummy . "\"と書きました";
}
?>
10件の記事(1ページ目表示中/全2ページ)
  1. 最初
  2. 1
  3. 2
  4. 最後

俺: 医療系事業会社のITサービス開発担当者

▼プロフィール畳む

▶プロフィール見る

ネットが産声をあげた前世紀末に元国営の通信会社に新卒入社し、以降およそ10年間勤務して、インターネット系の新規事業立ち上げに複数携わる。

その後、退職して、ITベンチャーのスタートアップ参画を皮切りに、複数のIT企業でプロダクトマネージャーを務めた後、縁あって現在の医療系事業会社へjoin。

元来、エンジニアばかりの環境で過ごしてきたが、いまいるここは一般の非IT系事業会社。

自分以外に実際に手を動かせるスタッフは誰もいない環境やさかい、IT系プロダクトの企画から内製によるシステム開発、ビッグデータ分析や人工知能のビジネス転化への試行錯誤も仕方なく一人でマルチに行い奮闘中。
(そろそろ仲間が欲しい・・・)

E-mail: contact@kobachan.biz

カテゴリー
月別アーカイブ
  • 2018 (4)
  • 2017 (6)