商売力開発ブログ

非エンジニアがWebサービスの開発、運営によって商売力をつける記録、その他の雑記

【スポンサーリンク】

「SHOE DOG」と「ナイキを育てた男たち」

今回はナイキの創業者フィル・ナイトが創業前から上場までを描いた自叙伝、SHOE DOGを紹介します。この本の発売後にBSで特集された番組「ナイキを育てた男たち~“SHOE DOG”とニッポン~」についても紹介します。

ナイキの創業の物語

大きめに本屋に行くと黒のカバーに金の文字でSHOE DOGと刻まれた本が並んでいるのを見た人も多いかもしれません。ナイキの創業者であるフィル・ナイトによる自叙伝で、500ページを超えるボリュームなのですが40万部を超えるヒットになっているそうです。

SHOE DOG(シュードッグ)

SHOE DOG(シュードッグ)

 

 出版元の東洋経済新報社では特集ページまで作る熱の入れようです。

store.toyokeizai.net

フィル・ナイトの曖昧な記憶を元にしていたり、誇張した部分も多々含まれると思いますが、創業前後から上場までの悪戦苦闘ぶりが赤裸々に語られていて、その語り口も相まって非常に面白い作品に仕上がっています。
オニツカの販売代理店として始まったという話は聞いたことがあったのですが、ナイキと日本の関わりが予想以上に深いことを知ることができます。この辺りはBSの特集番組がわかりやすくなっています。以下はその取材担当記者による紹介です。

www3.nhk.or.jp

www.msn.com

番組内では、当時のオニツカの開発担当がナイキ(当時はブルーリボンという社名)側からの提案を受けて開発したコルテッツの話をしたり、本書の中では日商岩井のスメラギ、イトーとして登場しているお二人が取材に応じています。
ナイキ側ではナイトだけでなく、あの「手紙魔」ジョンソンや車いすのウッデルも取材に応じてくれています。

この取材の中で特に印象深いのはアイスマン・イトーとフィルナイトが呼んでいた伊藤忠幸氏のエピソードです。本書の中の一つのクライマックスは口座を凍結されピンチに陥ったところを「日商が返済します」といってイトーがフィル・ナイトを、いやナイキを救ったところでしょう。この本の中でスメラギが独断で社内規定を破ってインボイスの発行を遅らせていたことが書かれていますが、イトーこと伊藤忠幸氏もこの返済エピソードの際に社内規定を破っていたことが番組内で語られます。
「日商が返済します」といった金額は約1億9千万円でした。これは日商岩井の中では社長決裁が必要な金額なのですが、伊藤忠幸氏は独断で決済したために、これが問題となりました。結果、伊藤忠幸氏はクビを通告されます。「権限規定なんか、無視してやっちゃたんですけども」とたんたんとした口調で語る伊藤忠幸氏、当時30代前半の年齢にして彼も人生をかけていたのです。その後、彼に気をかけた取締役の尽力でクビは撤回され日商岩井に残ることができたとのことです。

シュードッグな人々

フィル・ナイトは地元のオレゴン大学で陸上チームに所属、卒業後に陸軍での1年間の勤務を経て、スタンフォード大学大学院にでMBA取得しています。その後助言を受けて公認会計士の資格を取得し、会社を立ち上げながら、プライスウォーターハウスで働いたり、大学で会計学を教えることもありました。
本書を読んでいてわかるのは相当な読書家であること。特に各国の歴史・宗教・文化について詳しい上に、実際に世界中を見て回っているのも知識の深さを感じさせます。交渉する相手の国や文化を勉強する描写も良く出てきます。読書に関しては以下のようにあり、極限でのリーダーシップで自身がどうするべきかをよく考えてたことが伺えます。

私は大将、侍、将軍などについてできる限りの本を読んだが、中でも夢中だったのは私にとっての英雄3人、チャーチル、ケネディ、トルストイの伝記だった。暴力はまったく好まないが、極限状況でのリーダーシップについては興味があった。戦争は究極の極限状況だが、ビジネスもある意味戦争だ。ビジネスは銃弾のない戦争だと誰かが言っていたが、私も同感だ。
(1966: P128)

このように基礎的な学力、経営学・会計学や歴史などの知識、実行に移す行動力、自分たちを負け犬だという謙虚さ、これらだけでも並々ならぬモノがありますが、これに加え靴に対して強烈な情熱を持っています。タイトルでもあるシュードッグとは本書の中で以下のように言っています。

シュードッグとは靴の製造、販売、購入、デザインなどすべてに身を捧げる人間のことだ。靴の商売に長く関わり懸命に身を捧げ、靴以外のことは何も考えず何も話さない。そんな人間同士が、互いにそう呼び合っている。
(1971: P265)

熱中の領域を超え、病的とも言えるほど靴のことばかり考えてる人たちです。
フィル・ナイトはもちろんですが、このような人たちが多く登場します。中でも共同経営者となるバウワーマンと従業員第1号となるジョンソンは印象的です。

バウワーマンはオレゴン大学の陸上部の伝説的コーチで、フィル・ナイトも指導を受けた人物です。ナイキの創業前から独自にシューズの改良などを行うほど靴に情熱を注ぐ人物で、ナイキでもいくつかの靴ブランドの発明を行っている。初期にはオニツカの靴を分解し、アメリカ人に合うためにはどうすれば良いか徹底的に研究しオニツカに提案してコルテッツが誕生しています。
バウワーマンがエアソールの開発を聞いて駄目だねと言ってたことに対するフィル・ナイトの感想がシュードッグならではです。

私がエアソールを開発中だとうっかり漏らすと彼の様子が変わった。空気を注入したルディの発明のことをバウワーマンに話すと、彼はあざ笑ったのだ。「ぷっ。エアシューズだって。そんなものうまくいくわけがないだろ、バック」
彼の言葉から少し感じ取れたのは、嫉妬だろうか?
私はいい兆候だと思った。彼の中で競争心が再び芽生えてきたのだから。
(1977: P440)

バウワーマンに靴に対する情熱が戻ってきた様子を喜んでいます。1977年はバウワーマンは60代の後半に差し掛かってます。その少し前には衰えた描写もあります。しかし引退するよりも、靴に関わり続ける方がシュードッグな人々にとっては重要なのです。

そしてもう一人のジョンソンに関してはエピソードが事欠きません。ジョンソンも大学時代は陸上の中距離走者で、フィル・ナイトの誘いに乗り販売員となり、その後フルタイムの従業員第1号となります。自身でも靴を改良したり、販売店を任されますが、突然東海岸への理不尽な異動にあったりしますがめげません。面白いのは手紙に関するエピソードです。手紙魔とまで言われるほど手紙を出しまくっていたようで、最後に必ず励ましに言葉を求めるのですが、それをフィル・ナイトは無視し続けたそうです。更にはこんな記述があります。

いっそアパートを完全に引き払って、オフィスに移った方がいいのではという案が頭をよぎった。何せ基本的にそこで寝泊まりしているも同然で、プライス・ウォーターハウスとブルーリボンを交互に行き来する毎日だ。シャワーはジムで浴びればいい。
だがオフィスで暮らすなど、まともな人間のすることではないと自分に言い聞かせた。
そしてジョンソンから、オフィスで寝泊まりしているという手紙を受け取った。
(1967: P166)

経営層に励ましを求めても無視され続けるも、自分の仕事を今まで以上に邁進し続ける従業員、仕舞いにはオフィスに泊まり込む生活を送ってしまう。こんな人に出会ったことはありません。ジョンソンも靴に関わる仕事ができることが幸せだと考えていたのでしょう。

採用について

ジョンソンの後に続く2人目の従業員を探すところに以下のような記述があります。

私は、東海岸を任せられる人を雇うことにした。もちろん元長距離ランナーだ。
(1967: P148)

 「もちろん」というほど、ランナーであることが重要な要素であると考えていたようです(他の伝手がなかっただけかもしれませんが)。この初期の段階では、優秀な営業マンよりも靴(=自分たちの扱う製品・サービス)に対する情熱を持っている人が適任だし必要だと考えてたのでしょう。

それが10年経過して、色々な人を採用していく中で以下のような記述があります。

別に私が会計士や弁護士を偏愛しているわけではない。才能のある人間をどこで発掘すればいいのかわからないだけだ。
(中略)
頭の切れる人間を雇うことが先決であり、少なくとも会計士や弁護士なら難しい課題に対処できるだろうし、ここぞという試験にも受かるだろう。
これまで雇ったほとんどの者が基本的な能力を示してくれた。
会計士を雇うのは、計算ができるからだ。弁護士を雇うのは話が達者だからだ。だが、マーケティングの専門家や製品の開発者を雇ったところで、何が期待できるだろう。何もない。彼らに何ができるのか、できることがあるのかすら予想できない。ではそこらのビジネススクールの卒業生はどうか。誰も好き好んで靴を売ろうとは思わないだろう。しかもみんな経験はゼロだから、雇う側は面接での感触に賭けてサイコロを振るしかない。一か八かでサイコロを振っていられる余裕など、こっちにはないのだ。
(1978: P463~464)

靴に対して情熱があるかわからない人を雇ってきた中で、フィル・ナイトが到達した考えが会計士や弁護士なら戦力としてまだ計算しやすいということでしょう。マーケティングの専門家なども靴に対して情熱があるかわからない人の場合は、一か八かの賭けとなるというのが、シュードッグな人々の判断なのでしょう。

その他

 人が1日に歩く歩数は平均7500歩で、一生のうちでは2億7400万歩となり、これは世界一周の距離に相当する。シュードッグはそうした世界一周の旅に関わりたいのだろう。
 (1971: P266)

会計士でもあったフィル・ナイトはこうした数字で考えることも意識していたのではないかと思われます。例えば平均より多く歩く人たちはどんな人たちか、それはどんな理由で多くなっていて何歩くらい多いのかとか、2億7400万歩のうちどれだけナイキは貢献できるか、履いてもらう歩数を増やすにはどうしたら良いかといったものです。
これは現在でも同じで単純に靴の売上高だけを考えている人には出てこない発想でしょう。

貴重な教訓を得た。1足のシューズに12もの新機軸を取り込んではいけない。デザインチームに対してはもちろん、シューズにも多くを求め過ぎたらしい。私たちは「製図版に立ち返ろう」を合言葉に、ワッフルメーカーを何個もダメにしたバウワーマンのことを振り返った。
(1978: P470

靴というある程度の型が決まっている製品に関して、新たな機能を多く入れ過ぎたことを失敗だったと振り返っています。多くの新機能を取り込むことに注力し過ぎることで、どこかに無理や見落としが発生したのかもしれません。これは靴以外の製品やサービスならどうでしょうか。自分たちの行う事業で当てはめて考察してみるのも良いかもしれません。

問題はどうやって中国に進出するかではない。すでに一部の会社が進出を予定しており、そうなれば他社も続くだろう。問題はどうやって最初に乗り込むかだ。最初に進出すれば数十年は有利に立てる。そうすれば中国の製造部門だけでなく、中国市場や中国の政治指導者との関係も有利に運ぶことができ、大きな成功を見込める。中国についてミーティングを重ねた最初の頃、私たちは常にこう言っていた。あの国には10億人の足があると。
(1979: P484

これはこちらで紹介したようなマーケティング22の法則の一番手の法則に近い考え方です。中国という10億人の足がある巨大市場で、一番に進出することがどれだけ有利になるか、重要であるかを意識していたことが伺えます。

ジョンソンは言う。「つまり、この新製品のナイキはまったく未完成で、はっきり言えば、そこまで良い代物じゃないのに、君たちは買おうとしている。何がそんにいいんだ?」
相手は笑った。「君たちブルーリボンとは何年ものつきあいだから、君たちが正直なのはわかってる。他の連中はデタラメだけど、君たちはいつもズバリ本当のことを言ってくれるから、この新製品、ナイキっていうんだっけ、これが当たると言えば信じるさ」
ジョンソンはブースに戻って頭をかいた。「本当のことを言うべきなんだな」
(1972: P288

これはこちらで紹介したようなマーケティング22の法則の正直の法則に近い考え方です。この当時のナイキにはお客にとってポジティブな要素はあまりないのかもしれませんが、正直なことが評価されています。このあたりは靴に対して嘘をつけないそれまでのシュードッグな人々の姿勢が大きな信頼を得ることになったのでしょう。

まとめ

今回は「SHOE DOG」と「ナイキを育てた男たち」の紹介でした。

以上

【更新情報】ガントチャートの休日設定が可能に

※Project-Alphaは2019年12月をもって、サービスの提供を終了します。

今回は我々が開発しているプロジェクト管理ツールProject-Alpha(プロジェクトアルファ)を更新したので内容を説明します。

更新情報

更新内容

これまでガントチャートでは、1日単位で表示した場合に土日が自動でグレーアウトするのみでした。今回の更新により、グレーアウトする曜日を設定することができるようになります。更に祝日など特定の日にちを設定することができるようになります。これらはプロジェクト毎に管理されます。

更新画面など

プロジェクト設定画面のコンテンツ設定を表示すると、休日に関する設定メニューが表示されます。

曜日に関する設定画面はこちらになります。休日として設定したい曜日について設定することが可能です。

祝日など日付の休日設定の画面はこちらになります。以下は休日日付が何も設定されていない場合の状態になります。

国別の休日の参照

休日設定の参考にできるように、国別の祝日の内容を参照できるようにしています。ただし表示するのは、今年・去年・来年の3年分となります。未来の祝日は変更される可能性があるためで、翌年になると参照できる年が変わっていくようになります。
参照できる国は日本とアメリカとしています。以下では一覧から日本をクリックして参照した場合の表示になります。

例えば、日本の休日設定からコピペして、プロジェクトの休日設定をすることができます。以下は2018年の休日を設定した状態です。

この状態でガントチャートのコンテンツを表示して、日付単位を「1」としている場合、設定した曜日と休日がグレーアウトされます。例えば以下では土日と2018/07/16の海の日がグレーアウトされます。

Excel出力した場合にも対応しています。入力画面と同様に日付単位を「1」としている場合、設定した曜日と休日がグレーアウトされます。

プロジェクト作成時に選択可能

休日設定はプロジェクトを作成時に選択することで初期設定として設定されます。

ユーザ固有の休日設定も可能

休日設定は国別の祝日を参照できますが、祝日でない年末年始休暇などの設定が必要な場合があります。このようなときに利用できる独自の休日設定を行うことができるようになっています。PMのメニューから休日設定を選択すると基本設定と休日設定を行うことができます。基本設定の公開中を「はい」にすることで、プロジェクトの作成やプロジェクトの休日参照で表示されることになります。

固有の休日設定画面は以下のようになります。例えば以下では祝日にはない年末年始休暇として2017/01/03を追加している状態となります。

また公開中としていることで、プロジェクトの作成やプロジェクトの休日参照で固有の休日設定が表示され選択することができるようになります。

まとめ

今回は更新情報の内容の説明でした。

以上

【関連するリンク】 

www.prj-alpha.biz

www.prj-alpha.biz

home.prj-alpha.biz

はてなブログが独自ドメインでもHTTPS化できるようになってたので手順を確認しておく

はてなブログが独自ドメインでもHTTPS化できるようになってました。

staff.hatenablog.com

手順を確認しておきましょう。

HTTPS化の対応手順

上記のリンクに記載されている手順は以下の通り

  1. ダッシュボードから設定画面から詳細設定へいき、HTTPS化の設定変更を行う。こちらは1回行うと元に戻すことはできないとのこと・・・
  2. 混在コンテンツ(Mixed Content)の対応を行う。ただしmetaタグの設定での対応部分はEdgeなどのブラウザでは未対応。

記事内に張った自身のブログのリンクとかも、HTTPSに変更する必要がありますね。

後はツール関連ですが、対応が必要なのがグーグルの Search Console のアドレス変更の対応です。独自ドメインで運用しているような人ならば、使用割合は高いでしょう。

www.prj-alpha.biz

HTTPからHTTPSに301リダイレクトされる必要があるのですが、そこは自動でやってくれそうなので問題なさそうです。

とりあえず、はてなブログの設定変更を行っているユーザは結構いるみたいです。我々も早めに対応する予定です。

以上

【関連するリンク】

www.prj-alpha.biz

 

Laravelのマイグレーション機能の活用⑤ 複数テーブルに同じカラムを追加する

今回はPHPフレームワークの一つのLaravelの中から、データベースのマイグレーションの機能の利用に当たって、我々の活用方法を紹介します。
今回利用するDBはMySQLですが、一部については他のDBでもほぼ同様に対応できます。
またマイグレーションに関連する内容は以下を参照して下さい。

Laravelのデータベースのマイグレーション機能 順番を強引に入れ替えることも可能 - 商売力開発ブログ
Laravelのマイグレーション機能の活用① メンバ変数を追加した上でテーブルのコメント追加も簡単に設定する方法 - 商売力開発ブログ
Laravelのマイグレーション機能の活用② 1つのファイルで複数のテーブル管理も可能 - 商売力開発ブログ
Laravelのマイグレーション機能の活用③ カラム定義の管理を楽にする方法 - 商売力開発ブログ
Laravelのマイグレーション機能の活用④ カラム定義のメソッド設定例 - 商売力開発ブログ

カラム共通設定用のメソッドを使用してのカラムの追加

前回までの記事で説明したように、カラム名を指定することで定義を設定できるようなLaravelのファサードのメソッドを今回も利用します。

MigrationFunc::columnDef($table,'column_name');

このMigrationFuncファサードのメソッドの引数は以下のようなもので、nullableやデフォルト値の設定もできるものです。詳しくはこちらを参照して下さい。

public function columnDef(Blueprint $table,$column_name,$nullable_flg=false,$default=null)

今回は複数のテーブルに対して、同じカラムを追加する場合の対応を行います。ほぼ同じ構成のテーブルに対して行うイメージとなります。
まずはマイグレーションファイルに、テーブル名と追加するカラム名を設定します。今回はMySQLのみだけで利用できるafterのカラムも設定しています。

    public $tbl_array=array('tbl_name_1','tbl_name_2','tbl_name_3');
    public $add_col_name='add_colomn';
    public $aft_col_name='after_column';//MySQLのみ

これらのプロパティ(メンバ変数)を利用してupメソッドとdownメソッドを設定していきます。
またテーブルへの変更の場合、Schema::tableを使用して設定します。

Schema::table($tbl_name, function (Blueprint $table) {
    MigrationSet::columnDef($table,$this->add_col_name);
});

upメソッドの設定

upメソッドでは、追加対象のテーブル配列をforeachで処理するようにします。処理をする前に追加対象のテーブルが存在することと、そのテーブルに追加対象のカラムがないことをチェックすることが可能です。

if(Schema::hasTable($tbl_name) && !Schema::hasColumn($tbl_name,$this->add_col_name))

MySQLの場合、afterの設定によって特定のカラムの後に追加が可能です。こちらも追加対象のテーブルにafter対象のカラムがあることをチェックすることが可能です。

if(Schema::hasColumn($tbl_name,$this->aft_col_name))

ある場合はafterを設定し、ない場合はafterを設定しないようにします。
MigrationFunc::columnDefの設定により、afterを続けて設定することができます。

MigrationSet::columnDef($table,$this->add_col_name)->after($this->aft_col_name);

これらをまとめたupメソッドは以下のようになります。

    public function up()
    {
        foreach($this->tbl_array as $key => $tbl_name){
            if(Schema::hasTable($tbl_name) && !Schema::hasColumn($tbl_name,$this->add_col_name)){
                if(Schema::hasColumn($tbl_name,$this->aft_col_name)){
                    //MigrationSet後にafterを実行
                    Schema::table($tbl_name, function (Blueprint $table) {
                        MigrationSet::columnDef($table,$this->add_col_name)->after($this->aft_col_name);
                    });
                }else{
                    //afterなし
                    Schema::table($tbl_name, function (Blueprint $table) {
                        MigrationSet::columnDef($table,$this->add_col_name);
                    });
                }
            }
        }   
    }

こちらを実行すると、追加対象のテーブルに同じカラムが追加することができます。

downメソッドの設定

downメソッドでも、追加対象のテーブル配列をforeachで処理するようにします。処理をする前に追加対象のテーブルが存在することと、そのテーブルに追加対象のカラムがあることをチェックすることが可能です。

if(Schema::hasTable($tbl_name) && Schema::hasColumn($tbl_name,$this->add_col_name))

downメソッドでは追加したカラムの削除を行います。カラムの削除はdropColumnで行います。

$table->dropColumn($this->add_col_name);

これらをまとめたdownメソッドは以下のようになります。

    public function down()
    {
        foreach($this->tbl_array as $key => $tbl_name){
            if(Schema::hasTable($tbl_name) && Schema::hasColumn($tbl_name,$this->add_col_name)){
                Schema::table($tbl_name, function (Blueprint $table) {
                    $table->dropColumn($this->add_col_name);
                });
            }
        }
    }

こちらを実行すると、追加対象のテーブルに追加したカラムを削除することができます。

まとめ

今回はLaravelのマイグレーションの我々の活用方法のうち複数テーブルへの同じカラムの追加方法を紹介しました。

以上

【関連するリンク】 www.prj-alpha.biz www.prj-alpha.biz www.prj-alpha.biz www.prj-alpha.biz www.prj-alpha.biz

Laravelのマイグレーション機能の活用④ カラム定義のメソッド設定例

今回はPHPフレームワークの一つのLaravelの中から、データベースのマイグレーションの機能の利用に当たって、我々の活用方法を紹介します。
今回利用するDBはMySQLですが、一部については他のDBでもほぼ同様に対応できます。
前回説明したカラムの共通定義用のファサードのメソッドの設定について、具体的に紹介します。
www.prj-alpha.biz
また他のマイグレーションに関連する内容は以下を参照して下さい。

Laravelのデータベースのマイグレーション機能 順番を強引に入れ替えることも可能 - 商売力開発ブログ
Laravelのマイグレーション機能の活用① メンバ変数を追加した上でテーブルのコメント追加も簡単に設定する方法 - 商売力開発ブログ
Laravelのマイグレーション機能の活用② 1つのファイルで複数のテーブル管理も可能 - 商売力開発ブログ
Laravelのマイグレーション機能の活用⑤ 複数テーブルに同じカラムを追加する - 商売力開発ブログ

カラムの共通設定用のメソッド

前回の記事で、カラム名を指定することで定義を設定できるようなメソッドについて書きました。Laravelのファサード(MigrationFuncとします)を使用してメソッド(columnDefとします)の定義をすることで、マイグレーションファイルに以下のような記述をすることでカラムの定義ができるようにします。

MigrationFunc::columnDef($table,'group_cd');

このMigrationFuncファサードのメソッドの引数の定義は以下のようにし、この定義の具体的な実装部分を紹介します。

public function columnDef(Blueprint $table,$column_name,$nullable_flg=false,$default=null)

引数には以下を設定します。

  • $table:Schema::createやSchema::tableでカラム定義を設定するBlueprintインスタンスです
  • $column_name:設定対象のカラム名です
  • $nullable_flg:nullableを設定するかです、省略・指定がない場合はカラムは必須となります
  • $default:デフォルト値の設定用です、省略・指定がない場合はカラムのデフォルト値は設定しません

カラムの共通定義は連想配列などで以下のようなものとし、今回はMigrationFuncファサード内に設定しておきます。設定するタイプに応じて必要な値を追加しておきます。例えばstring型の場合はlenghtを追加して、設定する際にデータ長にします。

$columnSet = [
    'id' => ['type'=>'increments','comment'=>'ID'],
    'name' => ['type'=>'string','length'=>255,'comment'=>'名前'],
    'group_cd' => ['type'=>'string','length'=>5,'comment'=>'グループCD'],
];

ちなみにcommentはMySQLの場合、列に設定することができます。
続いて、指定されたカラム名から対象となる定義を取得し、データ型を指定します。データ型ごとに設定するメソッドが違いますので、それぞれ別けて設定する必要があります。ここでは、switch文で対応しています。また指定できるデータ型ごとのメソッドはかなり多いので、必要なものについて設定して下さい。

//対象のカラムセットを取得
$targetCol=$columnSet[$column_name];

//データ型の指定
switch($targetCol["dataType"]){
    case "increment":
        //incrementの設定
        $tblSetter=$_table->bigIncrements($column_name);
        break;
    case "text":
        //textの設定
        //defaultは設定できない
        $tblSetter=$_table->text($column_name);
        break;
    case "string":
        //stringの設定
        $tblSetter=$_table->string($column_name,$targetCol["length"]);
        break;
    case "dateTime":
        //dateTimeの設定
        $tblSetter=$_table->dateTime($column_name);
        break;
    case "date":
        //dateの設定
        $tblSetter=$_table->date($column_name);
        break;
    case "flg":
        //flgの設定
        $tblSetter=$_table->boolean($column_name);
        break;
    case "tinyInteger":
        //tinyIntegerの設定
        $tblSetter=$_table->tinyInteger($column_name);
        break;
    case "unsignedTinyInteger":
        //unsignedTinyIntegerの設定
        $tblSetter=$_table->unsignedTinyInteger($column_name);
        break;
    case "integer":
        //integerの設定
        $tblSetter=$_table->integer($column_name);
        break;
    case "double":
        //doubleの設定
        $tblSetter=$_table->double($column_name,$targetCol["length"],$targetCol["decimal"]);
        break;
    default:
        //設定がない場stringで設定する
        $tblSetter=$_table->string($column_name,255);
        break;
}

カラムの定義のあとに、nullableなどの設定を追加で行います。データ型を設定した変数:$tblSetterに追加で設定します。

//必須の解除
if($nullable_flg){
    $tblSetter->nullable();
}
//デフォルト
if($default!==null){
    $tblSetter->default($default);
}
//コメントの設定
//MySQLのみ設定可能
$tblSetter->comment($targetCol["comment"]);

最終的にはこの変数:$tblSetterをreturnします。こちらをreturnすることでマイグレーションファイル側で追加で別の設定を行うことも可能となります。

return $tblSetter;

以上がカラム定義のメソッドの設定例です。

カラム定義のコメントの設定について(MySQLの場合のみ)

カラム定義のコメントはMySQLのみ設定可能ですが、このコメントにルールを設けうると確認が楽になることがあります。例えば、データ型ごとにコメントの先頭に同一の記号などを設定しておきます。

$columnSet = [
    'id' => ['type'=>'increments','comment'=>'●ID'],
    'name' => ['type'=>'string','length'=>255,'comment'=>'■名前'],
    'group_cd' => ['type'=>'string','length'=>5,'comment'=>'■グループCD'],
];

このようなルールを設けておくと、MigrationFunc::columnDefで設定したカラムは先頭に特定の記号のあるコメントが付くようになります。

MigrationFunc::columnDef($table,'group_cd');

標準の設定方法のカラムのコメントでは記号を付けないようにすることで、MigrationFunc::columnDefで設定したカラムと区別できるようにしてます。

$table->string('group_cd',5)->comment('グループCD');

ちょっとしたことですが、共通定義で設定されたカラムか簡単に分かるようになります。

まとめ

今回はLaravelのマイグレーションの我々の活用方法のうちカラムの共通定義用のファサードのメソッドの設定を紹介しました。
新規サービスの開発段階では一部は使える方法ではないかと思いますので、参考にしてみて下さい。

以上

【関連するリンク】 www.prj-alpha.biz www.prj-alpha.biz www.prj-alpha.biz www.prj-alpha.biz www.prj-alpha.biz

【更新情報】ガントチャートの担当にプロジェクトメンバーを設定可能に

※Project-Alphaは2019年12月をもって、サービスの提供を終了します。

今回は我々が開発しているプロジェクト管理ツールProject-Alpha(プロジェクトアルファ)を更新したので内容を説明します。

更新情報

更新内容

これまでガントチャートなどのコンテンツでの担当欄では、別途設定した担当用のプルダウンリストが使用できました。今回の更新により、担当用プルダウンではなくプロジェクトメンバーを設定できるようになります。

更新画面など

担当欄で使用する内容は各コンテンツ設定で変更可能となります。

プロジェクトメンバーに変更後は、アサインされているプロジェクトメンバーが担当に表示されます。

プロジェクトメンバーの場合、初期設定では「ID + 名前」で表示されます。こちらプロジェクト設定で、「IDのみ」や「名前のみ」に変更することも可能です。

「名前のみ」の場合、重複することがありますが、重複した場合は後ろにIDが追加されます。

ガントチャートのバー色についてもメンバー毎に設定できるようになります。

オーナーについては、オーナー設定で変更して下さい。

注意事項

コンテンツのデータを入力後に、この担当の選択方法を変更するとコンテンツの担当のデータが表示されなくなります。入力後に変更した場合は担当のデータを修正して下さい。
担当の選択方法をプロジェクトメンバーとした場合、表示されるのはその時点のプロジェクトメンバーです。あるメンバーを担当に設定していて、そのメンバーをアサインから外した場合はその担当の入力欄は空白となりますので注意して下さい。

まとめ

今回は更新情報の内容の説明でした。

以上

【関連するリンク】

www.prj-alpha.biz

www.prj-alpha.biz

home.prj-alpha.biz

CSSのみでハンバーガーメニューのクリックでメニューの表示・非表示を制御する

今回はCSSのみでハンバーガーメニューのクリックでメニューの表示・非表示を制御する方法を紹介します。
Googleアナリティクスで状況を見ると、サービスサイトにスマホからアクセスがあったのでレスポンシブ対応も兼ねて設定しました。

完成イメージ

まずは完成イメージを以下に示します。




ハンバーガーメニューとも言われる3本線を押すと、下にメニューが表示されます。またハンバーガーメニューを押すと今度は非表示となります。
これらの制御をJavaScriptを使用しないで、CSSのみで対応していきます。

CSSだけで対応する方針

この動作をCSSだけで対応するのに、checkboxの2つの機能を利用して対応します。

checkboxのオンオフによる制御

Input要素のcheckboxを使用して表示・非表示の制御をします。checkboxのオン時にのみ適用できるCSSの疑似クラスで制御します。以下のようなhtmlがあるとします。

    <input id="topHeadNaviToggleCkBox" type="checkbox" class="naviToggleCkbox" value=0>
    <ul class="naviToggleTarget">

このinput要素のcheckboxがオンとなるとき、つまりチェックされた場合の疑似クラス「:checked」を使用してCSSを設定することが可能です。この「:checked」に隣接要素を指定する「+」などを利用することで、その他の要素もオンとなっときだけ適用するスタイルの設定が可能となります。
例えば「.naviToggleTarget」は通常は非表示で、checkboxがオンのときは表示する場合のCSSは以下になります。

.naviToggleCkbox:checked{
    /* チェックされたときのみ適用される checkbox要素 */
}
.naviToggleTarget {
    display: none;
}
.naviToggleCkbox:checked + .naviToggleTarget {
     /* チェックされたときのみ適用される  checkbox要素の次の要素 */
    display: block;
}

labelとcheckboxの連動

checkboxのオンオフによる制御ができることがわかったと思いますが、実際にcheckboxをオンオフするとなるとcheckboxは小さくユーザからすると操作しにくいです。そこでlabelのfor属性を利用します。for属性にはinput要素のid属性を指定すること、そのlabelと関連付けることができます。for属性にcheckboxを指定することで、そのlabel要素をクリックすると、checkboxをオンオフすることができるようになります。

   <label class="naviToggleLabel" for="topHeadNaviToggleCkBox">
    <input id="topHeadNaviToggleCkBox" type="checkbox" class="naviToggleCkbox" value=0>
    <ul class="naviToggleTarget">
     <li class="toggleItemCont">
      <a href="index.html">ホーム</a>
     </li>
    </ul>
   </label>

この設定の場合、input要素自体は非表示にしておき、label要素だけを表示させるようにする対応が多いです。オンオフの制御と合わせることで、label要素のどこかをクリックすることで「.naviToggleTarget」が表示・非表示になり完成イメージのようになります。

対応例

htmlの例は以下のようになります。

  <div class="naviToggleMenuCont">
   <label class="naviToggleLabel" for="topHeadNaviToggleCkBox">
    <div class="naviToggleSwitch">
     <span class="iconToggleSwitch"></span>
    </div>
    <input id="topHeadNaviToggleCkBox" type="checkbox" class="naviToggleCkbox" value=0>
    <ul class="naviToggleTarget">
     <li class="toggleItemCont theme_bg_light theme_bg_hov_dark">
      <a href="index.html">ホーム</a>
     </li>
    </ul>
    <div class="toggleOverlay"></div>
   </label>
  </div>

input要素を非表示になっているとした場合、checkboxがオフのとき見え方は以下のようになります。




赤枠で囲った部分の「.naviToggleSwitch」はハンバーガーメニュー部分です。黄色枠で囲った部分がlabel要素の全体となります。先に説明したようにlabel要素をクリックするとcheckboxがオンオフできるので、実はこの黄色枠のどこかをクリックすれば表示・非表示が切り替わるようになります。ハンバーガーメニュー部分はメニュー表示・非表示ができる印として配置しているだけです。ハンバーガーメニュー自体は画像、アイコンフォント、CSSなどいくつかの対応方法がありますが、今回はハンバーガーメニュー自体の作り方は特に説明しないので好きな方法で対応して下さい。
checkboxがオフのとき見え方は以下のようになります。




赤枠で囲った部分の「.naviToggleTarget」は表示・非表示されるメニュー部分です。黄色枠で囲った部分は「.toggleOverlay」としています。この黄色枠部分は「.naviToggleTarget」と同様にcheckboxにより表示・非表示され、画面に表示される部分でメニュー部分(「.naviToggleTarget」の部分)以外をこの要素になるようにCSSで設定します。これにより、メニュー部分以外をクリックした場合、label要素の子要素である「.toggleOverlay」がクリックされることになり、結果としてcheckboxがオンからオフに切り替わるようになり、メニューが非表示の状態にすることができます。

細かい装飾部分を除いて、メニュー表示・非表示に関わるCSSの設定例は以下のようになります。

.naviToggleCkbox {
    /* checkbox要素は常に非表示 */
    display: none;
}
.naviToggleTarget {
    /* メニュー部分、通常は非表示にする */
    display: none;
}
.naviToggleCkbox:checked + .naviToggleTarget {
     /* checkboxがオンのとき、メニューを表示する  */
    display: block;
    z-index: 20;/* toggleOverlayより上に表示する */
}
.naviToggleCkbox:checked + .naviToggleTarget + .toggleOverlay {
     /* checkboxがオンのとき、メニュー以外の部分  */
    position: fixed;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    z-index: 10;/* naviToggleTargetより下に表示する */
}

checkboxがオンのとき、「.naviToggleTarget」と「.toggleOverlay」にz-indexを指定して、「.naviToggleTarget」を上に表示するようにします。「.naviToggleTarget」は「position: fixed;」にしてtopなどを指定することで、画面全体に表示される状態となります。
このCSSの設定により、メニュー部分の表示・非表示を制御することができます。後はお好みに合わせて装飾を設定して下さい。

まとめ

今回はCSSの設定でのメニューの表示・非表示を制御する方法の紹介でした。
JavaScriptが不要なので簡単に対応することができます。

以上

【スポンサーリンク】