coreserverにgitコマンドをビルドして入れた at 2017

git clone https://github.com/kanonji/editorconfig.git
Cloning into 'editorconfig'...
fatal: Unable to find remote helper for 'https'

久しぶりにcoreserverにgitコマンドをビルドして入れた | kanonjiのブログで用意していたgitでcloneしようとしたら、なんかエラーになってしまいました。
仕方がないので、改めてgitのビルドをしました。

ちなみにcoreserverはホスティングサービスの名称です。

補足

今回は、最新のgitのtarballを落としてきてビルドしたら、問題無くビルド完了・・・と思ったけど、やっぱりgit cloneに失敗しました。
あれこれ試し、結局はcurlも最新をビルドして、それを使ってgitをビルドしたらclone出来るgitコマンドが手に入りました。

エラーメッセージからcurlっぽい気はしていたものの、curlコマンドは使える環境だし、gitのビルドが通ってるので迷いました。
GitでのHTTP通信覚え書き書き込み編 – massの日記でも、gitのビルドは出来てて通信に問題がありyum install curl-develをして解決したらしい。
なので良く分からないけど、何か不足があってもgitのビルドは通ってしまうのかもしれない。

curlのビルド

> curl -LO https://github.com/curl/curl/releases/download/curl-7_54_0/curl-7.54.0.tar.gz
> tar xzvf curl-7.54.0.tar.gz
> mv curl-7.54.0/
> echo './configure --prefix=$HOME/myhome/local/curl-7.54.0' > init.sh
> chmod u+x init.sh
> .init.sh
[snip]
configure: Configured to build curl/libcurl:

  curl version:     7.54.0
  Host setup:       i686-pc-linux-gnu
  Install prefix:   /virtual/* * */myhome/local/curl-7.54.0
  Compiler:         gcc
  SSL support:      enabled (OpenSSL)
  SSH support:      no      (--with-libssh2)
  zlib support:     enabled
  GSS-API support:  no      (--with-gssapi)
  TLS-SRP support:  enabled
  resolver:         default (--enable-ares / --enable-threaded-resolver)
  IPv6 support:     enabled
  Unix sockets support: enabled
  IDN support:      no      (--with-{libidn2,winidn})
  Build libcurl:    Shared=yes, Static=yes
  Built-in manual:  enabled
  --libcurl option: enabled (--disable-libcurl-option)
  Verbose errors:   enabled (--disable-verbose)
  SSPI support:     no      (--enable-sspi)
  ca cert bundle:   no
  ca cert path:     /etc/ssl/certs/
  ca fallback:      no
  LDAP support:     no      (--enable-ldap / --with-ldap-lib / --with-lber-lib)
  LDAPS support:    no      (--enable-ldaps)
  RTSP support:     enabled
  RTMP support:     no      (--with-librtmp)
  metalink support: no      (--with-libmetalink)
  PSL support:      no      (libpsl not found)
  HTTP2 support:    disabled (--with-nghttp2)
  Protocols:        DICT FILE FTP FTPS GOPHER HTTP HTTPS IMAP IMAPS POP3 POP3S RTSP SMB SMBS SMTP SMTPS TELNET TFTP
> make
> make install

gitのビルド

> curl -LO https://github.com/git/git/archive/v2.13.1.tar.gz
> mv v2.13.1.tar.gz git-v2.13.1.tar.gz
> tar xzvf git-v2.13.1.tar.gz
> cd git-v2.13.1.tar/
> make configure
> echo './configure --prefix=$HOME/local/git-2.13.1 --with-curl=$HOME/local/curl-7.54.0 --with-expat --with-openssl' > init.sh
> chmod u+x init.sh
> .init.sh
> make all
> make install

シンボリックリンク作成

> cd ~/myhome/local/bin
> rm git*
> ln -s ../git-2.13.1/bin/* .

前回はlibやshareの中身もやってたけど、多分要らなかったから今回は無しで。

環境

環境 バージョン
coreserver -
curl 7.54.0
git 2.13.1

書いた日

2017年6月19日頃

Bash on Ubuntu on WindowsにaptでJavaを入れてみた

ちょっとBash on Ubuntu on WindowsでJavaのツールを動かしてみたくなったので、aptでインストールしてみました。

Bash on Windows でJavaコマンドを使いたい – Qiita

ただインストールしただけの話なんだけど、このQiitaのエントリーではaptでのインストールに失敗していて、何故か自分の環境では同じ方法で成功したので、その記録です。

インストール

 $ java
プログラム 'java' は以下のパッケージで見つかりました:
 * default-jre
 * gcj-4.8-jre-headless
 * openjdk-7-jre-headless
 * gcj-4.6-jre-headless
 * openjdk-6-jre-headless
次の操作を試してください: sudo apt-get install <選択したパッケージ>

この中から選べる様なので、Qiitaのエントリーと同様にopenjdk-7-jre-headlessを選びました。

$ sudo apt install  openjdk-7-jre-headless
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の特別パッケージがインストールされます:
  ca-certificates-java fontconfig-config fonts-dejavu-core java-common
  libasyncns0 libavahi-client3 libavahi-common-data libavahi-common3 libcups2
  libflac8 libfontconfig1 libfreetype6 libjpeg-turbo8 libjpeg8 liblcms2-2
  libnspr4 libnss3 libnss3-nssdb libogg0 libpcsclite1 libpulse0 libsctp1
  libsndfile1 libvorbis0a libvorbisenc2 lksctp-tools tzdata-java
提案パッケージ:
  default-jre equivs cups-common liblcms2-utils pcscd pulseaudio
  icedtea-7-jre-jamvm libnss-mdns sun-java6-fonts fonts-dejavu-extra
  fonts-ipafont-gothic fonts-ipafont-mincho ttf-wqy-microhei ttf-wqy-zenhei
  ttf-indic-fonts ttf-indic-fonts-core ttf-telugu-fonts ttf-oriya-fonts
  ttf-kannada-fonts ttf-bengali-fonts
以下のパッケージが新たにインストールされます:
  ca-certificates-java fontconfig-config fonts-dejavu-core java-common
  libasyncns0 libavahi-client3 libavahi-common-data libavahi-common3 libcups2
  libflac8 libfontconfig1 libfreetype6 libjpeg-turbo8 libjpeg8 liblcms2-2
  libnspr4 libnss3 libnss3-nssdb libogg0 libpcsclite1 libpulse0 libsctp1
  libsndfile1 libvorbis0a libvorbisenc2 lksctp-tools openjdk-7-jre-headless
  tzdata-java
アップグレード: 0 個、新規インストール: 28 個、削除: 0 個、保留: 21 個。
43.5 MB 中 39.4 MB のアーカイブを取得する必要があります。
この操作後に追加で 72.6 MB のディスク容量が消費されます。
続行しますか? [Y/n]
[snip]
Adding debian:Chambers_of_Commerce_Root_-_2008.pem
Warning: there was a problem reading the certificate file /etc/ssl/certs/China_Internet_Network_Information_Center_EV_Certificates_Root.pem. Message:
  /etc/ssl/certs/China_Internet_Network_Information_Center_EV_Certificates_Root.pem (そのようなファイルやディレクトリはありません)
Adding debian:ComSign_CA.pem
[snip]
done.
openjdk-7-jre-headless:amd64 (7u131-2.6.9-0ubuntu0.14.04.2) を設定しています ...
update-alternatives: /usr/bin/java (java) を提供するために 自動モード で /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java を使います
update-alternatives: /usr/bin/keytool (keytool) を提供するために 自動モード で /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/keytool を使います
update-alternatives: /usr/bin/pack200 (pack200) を提供するために 自動モード で /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/pack200 を使います
update-alternatives: /usr/bin/rmid (rmid) を提供するために 自動モード で /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/rmid を使います
update-alternatives: /usr/bin/rmiregistry (rmiregistry) を提供するために 自動モード で /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/rmiregistry を使います
update-alternatives: /usr/bin/unpack200 (unpack200) を提供するために 自動モード で /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/unpack200 を使います
update-alternatives: /usr/bin/orbd (orbd) を提供するために 自動モード で /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/orbd を使います
update-alternatives: /usr/bin/servertool (servertool) を提供するために 自動モード で /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/servertool を使います
update-alternatives: /usr/bin/tnameserv (tnameserv) を提供するために 自動モード で /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/tnameserv を使います
update-alternatives: /usr/bin/jexec (jexec) を提供するために 自動モード で /usr/lib/jvm/java-7-openjdk-amd64/jre/lib/jexec を使います
libc-bin (2.19-0ubuntu6.11) のトリガを処理しています ...
ca-certificates (20160104ubuntu0.14.04.1) のトリガを処理しています ...
Updating certificates in /etc/ssl/certs... W: /usr/share/ca-certificates/mozilla/China_Internet_Network_Information_Center_EV_Certificates_Root.crt not found, but listed in /etc/ca-certificates.conf.
0 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d....
done.
done.

こんな感じで、1個のcertificate fileでちょっと警告が出てるものの、インストールが完了しました。

インストールしたJavaのバージョン

$ java -version
java version "1.7.0_131"
OpenJDK Runtime Environment (IcedTea 2.6.9) (7u131-2.6.9-0ubuntu0.14.04.2)
OpenJDK 64-Bit Server VM (build 24.131-b00, mixed mode)

環境

環境 バージョン
Windows Windows 10 Home
Bash on Ubuntu on Windows 取得方法不明
Java 1.7.0_131

書いた日

2017年5月31日頃

親オブジェクトのスケールを変更し子オブジェクトを回転すると形が歪む

File_ Screencast 04-10 30-05-2017.mp4 2017-05-31 12.48.27

  1. Emptyなゲームオブジェクトを作って、スケールをx: 10にする。
  2. Cubeを作ってEmptyの子にする。
  3. Cubeを回転すると歪む。

もしかしたら当たり前の事なのかも知れないけど、自分はあまりスケールをいじらないせいか今まで知りませんでした。
他にも1人ほど、ちょっとこれにはまった人も見かけたので、書いておけば役に立つ事もあるかもという事でメモとして書いておきます。

確認用プロジェクト

https://github.com/kanonji/UnitySmallExperiment/tree/master/Assets/RotateChildInScaledParent

そんな大した事じゃないんだけど、実際に触って確認できると分かりやすいって事もあるかもって事で作りました。
こういうちょっとした、けど動かして確認したいってものを蓄積するプロジェクトとしてhttps://github.com/kanonji/UnitySmallExperimentを作ってあったので、そこに入れてあります。

UnitySmallExperimentには他にもいくつか入ってるけど、ドキュメントをちゃんと書かなかったせいで、自分でも何を確認したくて作ったのか分からないものが入ってる、微妙なプロジェクトになってしまっています。
暇を見て解読して、簡単にでも意図を書き足していきたい。

環境

環境 バージョン
Unity 5.6.1p1

書いた日

2017年5月31日頃

Unity 5.6でStandard AssetのImage Effectが消え、Post Processing Stackに置き換わったようだ

Unity 5.6.0p3 Personal (64bit) - EnvironmentExterior.unity - try-unity-sun-shaft - PC, Mac & Linux Standalone_ _DX11_ 2017-05-10 04.37.01

ちょっとこの画像のような後光が出来るSun Shaftsというイメージエフェクトを使いたくなってStandard Assetをインポートしたんですが、Sun Shaftsが無くなっていました。

Unity 5.6.0p3 Personal (64bit) - Untitled - New Unity Project - PC, Mac & Linux Standalone _DX11_ 2017-05-10 03.39.49

Sun Shaftsだけじゃなく、Image Effectsフォルダの中が空になっていました。
代わりにReadmeが置いてあり、どうやらイメージエフェクトはPost Processing Stackに置き換わったらしいです。

Post Processing Stack – アセットストア

Post Processing Stackをざっと眺めてみた感じだと、今までのイメージエフェクトと同じような内容になってるみたいだけど、Sun Shaftsは入ってなさそうな感じ。

Legacy Image Effects – アセットストア

そして、古いイメージエフェクトはパッケージ化してアセットストアで提供しているとあります。
このアセットにはちゃんとSun Shaftsが入ってました。

そういえばCinematic Image Effectsはどうなった?

Sun Shaftsがあったのはとりあえず良いんだけど、そういえばCinematic Image Effectsってのもあったような気がします。
ちょっとPost Processing Stack、Cinematic Image Effects、Standard AssetのEffectsに含まれるImage EffectsのURLとバージョンなんかを調べて書き出してみました。

Post Processing Stack

Post Processing Stack – アセットストア

  • Unity 5.5から利用可能

ソースコード

Unity-Technologies/PostProcessing: Post Processing Stack

参考サイト

新しいポストプロセススタック

新しい Unity ポストプロセススタックは(今後廃止予定のシネマティックイメージエフェクトの後継で)、5.6と5.5で利用可能です。新しいポストプロセススタックの必須パッケージはアセットストアから無料でダウンロードできます。

Unity 5.6のリリースと、Unity 5の完了 – Unity Blog

Unity 5.6のリリース記事を読む感じ、Standard Assetに同梱はせずにアセットストアで提供のままになりそう。

Cinematic Image Effects

レガシーシネマティックイメージエフェクト – アセットストア

  • Unity 5.3.5から利用可能

ソースコード

参考サイト

シネマティックイメージエフェクトとモーションベクターサポート

おっと、シネマティックイメージエフェクト (スクリーンスペースレイトレースリフレクション, 被写界深度、 トーンマッピング、カラーグレーディングなど)がオープンソースパッケージとしてAsset Storeで入手できるのも忘れてはいけません(さらにこちらのリポジトリで開発に寄与することもできます)。シネマティックイメージエフェクトは、Adam デモでその有効な利用法が紹介されています。

Unity 5.4リリース – 新機能のご紹介 – Unity Blog

アセットストアでは5.3.5から使えるとあるけど、Unity 5.4のリリース記事に載っていたので、正式には5.4からという位置づけっぽい。
Standard AssetのEffectsの一部だったImage Effectsを置き換えるのかと思いきや、リポジトリでプレリリース、アセットストアで提供を経て、前述の通り廃止予定となったみたい。
既にアセットストアで、パッケージ名にレガシーと付いている。

Standard AssetのEffectsに含まれるImage Effects

Legacy Image Effects – アセットストア

Standard Assetとして同梱されていて、5系になった時に内容が刷新されたので5.0から使えるイメージエフェクトだった。
5.6でStandard Assetから削除され、上記の独立したパッケージとしてアセットストアで提供されるようになった。
アセットストアからのパッケージはUnity 5.5から利用可能。

参考サイト

書いた日

2017年5月10日頃

Gitでとあるコミットの次のコミットを見つける方法

$ git log --reverse --ancestry-path <hash>^..master

これで<hash>から開始してmasterのHEADまでのコミットを順番に表示できます。
なので、次のコミットも、次の次のコミットも見つけられます。

自分で編み出したわけじゃなく、探したら見つけただけですが、書いておかないと忘れるので書いておきます。

例えば

完全に仮の話だけど、CakePHPのリポジトリを使って例えばこういう使い方と言うのをやってみます。

$ git show 2647fd9e35e1e65a3e847af1017f8bd603a15d7f
commit 2647fd9e35e1e65a3e847af1017f8bd603a15d7f
Author: [snip]
Date:   Thu Apr 2 23:05:38 2015 +0100

    PasswordHasherFactory Fix

    Removing invalid character accidentally added to file when cleaning up

diff --git a/src/Auth/PasswordHasherFactory.php b/src/Auth/PasswordHasherFactory.php
index 9c0927c5e7..303c2a837e 100644
--- a/src/Auth/PasswordHasherFactory.php
+++ b/src/Auth/PasswordHasherFactory.php
@@ -53,7 +53,7 @@ class PasswordHasherFactory
         if (!($hasher instanceof AbstractPasswordHasher)) {
             throw new RuntimeException('Password hasher must extend AbstractPasswordHasher class.');
         }
-˙
+
         return $hasher;
     }
 }

この間、何かコードの意図を知りたいとかでgit blameで深掘りした時、着目している行を変更したコミットは見つけたけど、前後のコミットもみないとよく分からないって事がありました。
上のコミット2647fd9e35e1e65a3e847af1017f8bd603a15d7fは、空行のスペースを消しただけなので、意図も何もないんですが、このコミットの次のコミットが見たい状況だと思ってください。

指定のコミットの前のコミットであれば、単純にgit log <hash>でもいいしgit show <hash>^でもいいけど、次のコミットを見る手段が思いつきません。

$ git log --reverse --ancestry-path 2647fd9e35e1e65a3e847af1017f8bd603a15d7f^..master
commit 2647fd9e35e1e65a3e847af1017f8bd603a15d7f
Author: [snip]
Date:   Thu Apr 2 23:05:38 2015 +0100

    PasswordHasherFactory Fix

    Removing invalid character accidentally added to file when cleaning up

commit 4105c2dc5da469855e908c4856b551b4084d8fb5
Author: [snip]
Date:   Fri Apr 3 08:59:54 2015 +0100

    Docblock Absolute Path

    Updating docblock to use absolute path for RuntimeException

commit 6859505911165c775e26aff0ae9f185b46c7d8fb
Merge: 4105c2dc5d b307d68d78
Author: [snip]
Date:   Fri Apr 3 09:07:56 2015 +0100

    Merge pull request #1 from cakephp/master

    Update from Master #2
[snip]

こんな感じで、指定したコミットからmasterのHEADまでのgit logが出ました。

参照元

To list all the commits, starting from the current one, and then its child, and so on – basically standard git log, but going the other way in time, use something like

git log --reverse --ancestry-path 894e8b4e93d8f3^..master

where 894e8b4e93d8f3 is the first commit you want to show.

http://stackoverflow.com/a/9870218

出来ればgit show <hash>^みたいな感じで^の別の記号で次が指定出来ると、もっと楽なんだけど、とりあえず見つけられるだけでも助かります。

書いた日

2017年4月14日頃

Blender 2.78の動作が異様に遅かったがGPUドライバのバージョンを上げて改善した

Blender勉強会 Step 3 – 関東ゲーム制作部 | Doorkeeperに参加する準備をする為、前日の金曜日のBlenderを起動したら、なぜか異様に動作が遅く、使い物にならない感じでした。
メニューにカーソルを乗せた時の、選択状態を示すハイライトですら乗せてから数秒かかるくらいに遅いです。
CPUやGPUなどリソースを大量に消費している風ではなく、Blenderだけが遅いとういう状況でした。

Blenderを起動するのも少し久しぶりだったので、何も原因に思い当たるものがなかったんだけど、どうやらドライバに原因があることが分かりました。

原因

Blender is currently unusable on NVIDIA GPUs (M – MX family) – Blender Meta Stack Exchange

Blenderの2.78とNVIDIAのGPU(M, MXファミリー)の、376.xあたりのバージョンのドライバの組み合わせで、発生している様です。
上で報告されてるバージョンは376.09からで、自分のPCでは376.54で発生してました。
なので少なくとも376.09~376.54で、まぁたぶん376.xが大体ダメなんじゃないかなと思います。

解決

単純にドライバのバージョンを378.66に上げたところ、改善しました。

環境

環境 バージョン
Windows 10 Home 1607
Blender 2.78c
NVIDIAドライバー 376.54

書いた日

2017年3月5日頃

昔あったsession_regenerate_id(true)でCakePHP2のセッションが切れる問題を再確認

まだCakePHP2系が最新バージョンだった昔、不意にセッションが切れてログアウトなどが起こるという話があり、確かsession_regenerate_id(true)とリンク切れの画像/css/jsやfaviconに原因があるという結論で、ちゃんと技術的に解説もあるエントリーを見た記憶がありました。
今やってるプロジェクトもCakePHP2系で、希ながら不意にログアウトするという報告があって、そういえば昔そんな話があったなと上記のエントリーを探したけど、なぜか出て来ませんでした。
よく分からないけど、この設定にしたら改善したっぽいみたいな、ふんわりしたのは出てくるんだけど。
なので、今更だけど改めてsession_regenerate_id(true)でセッションが切れるケースを確認してみました。

なお、問題はCakePHPではなくsession_regenerate_id(true)を使ってる状況の方にあるので、CakePHPは使わずにPHPだけで確認しています。

前提と結論

まず、session_regenerate_id(true)でセッションが切れるというのはsession_regenerate_id()に何かバグがあるといった話ではないです。

CakePHP2などのフレームワークを使っていて、リクエスト毎に必ずsession_regenerate_id(true)でセッションIDを作り直してる場合に、リンク切れの画像などやfaviconの設置が無い等が2個以上ある状況が、前提としてあります。
確認はして無いけど、CakePHP3でも、おそらく他の大抵のフレームワークでもリクエスト毎にsession_regenerate_id(true)してるなら、発生すると思います。

大抵のフレームワークは、全てのリクエストをindex.phpが受け取って、フレームワーク内のディスパッチャーがURLに対応したコントローラーに振り分ける仕組みになっていると思います。
ただ、画像/css/js等の実ファイルを返せば良いだけのものは、フレームワークでの処理を挟むのは無駄なので、ファイルが存在する場合はindex.phpにリクエストを渡さずに、Webサーバーが直接ファイルを返す様になっているはずです。
CakePHP2とApacheの場合は.htaccessに書かれたmod_rewriteの設定がそうなっています。

セッション切れが起こるケースですが、画像/css/js等がリンク切れ、つまり実ファイルが存在し無い場合があればindex.phpがリクエストを受け取った上で、フレームワークが404を返す事になります。
その際、session_regenerate_id(true)によるセッションIDの再発行も行われます。

  1. Webページにアクセスする。フレームワークが処理をするので、セッションIDが再生成される。
  2. ブラウザは必ずfavionへのリクエストを発行するが、faviconを設置して無い場合、フレームワークにリクエストが渡り、404を返す。その際セッションIDの再生成が起こる。
  3. HTML内のとある画像が<img>は書いてあるが画像ファイルは削除済みで、これも同様にフレームワークにリクエストが渡り、404を返す。この時ブラウザがリクエストに付与したセッションIDはすでに無効になっており、セッション切れ、ログイン状態であればログアウトが発生する。

session_regenerate_id(true)と、リンク切れ画像/css/jsやfaviconでセッションが切れる、ログアウトするというのは、こういう流れで発生します。

実際に確認する

Destroying session with sessionregenerateid(true)

$ git clone git@gist.github.com:acf97c84fac6ffbff794d77dbd41c1ec.git <dir>
$ cd <dir>
$ php -S localhost:8080

Gistに簡単なコードを置きました。
PHPのbuilt-inサーバーを起動します。

<?php
if (false === file_exists('./session')) mkdir('./session');
session_save_path('./session');
session_start();
$_SESSION['foo'] = 'foo';
echo 'Session started' . '<br>' . PHP_EOL;
echo session_id() . '<br>' . PHP_EOL;
echo '$_SESSION["foo"]: ' . $_SESSION['foo'] . '<br>' . PHP_EOL;

https://gist.github.com/kanonji/acf97c84fac6ffbff794d77dbd41c1ec#file-init-php

index

まずブラウザでhttp://localhost:8080/init.phpにアクセスします。
セッションを開始してfooをセッションに格納しておきます。

<?php
session_save_path('./session');
session_start();
echo 'Session started' . '<br>' . PHP_EOL;
echo session_id() . '<br>' . PHP_EOL;
session_regenerate_id(true);
echo 'Session regenerated' . '<br>' . PHP_EOL;
echo session_id() . '<br>' . PHP_EOL;
echo '$_SESSION["foo"]: ' . $_SESSION['foo'] . '<br>' . PHP_EOL;
?>
<hr>
<iframe src="."></iframe>
<iframe src="."></iframe>
<iframe src="."></iframe>

https://gist.github.com/kanonji/acf97c84fac6ffbff794d77dbd41c1ec#file-index-php

init

今度はhttp://localhost:8080/にアクセスします。
このindex.phpではsession_regenerate_id(true)でセッションIDを再発行し、古いセッションIDは無効になります。
当然だけどinit.phpで発行されたセッションIDを使うので、セッションに格納したfooが取り出せてます。

ここからが問題でindex.phpには3個のiframeがあり、どれもindex.phpにアクセスする様になっています。
HTMLに<img><link><script>で埋め込まれた画像/css/jsやfaviconへのリクエストが、ファイルが存在しなかった為にindex.phpに渡された状況と同じです。

HTMLを返すレスポンスで、新しいセッションIDが来てるので、各iframeへのリクエストはそのセッションID(A)が使われます。
しかし、1個目のiframeへのリクエストで、さらにセッションIDが作り直されセッションID(A)は無効になっているのに、2個目3個目へのリクエストも、HTMLのレスポンスで貰ったセッションID(A)を使っています。

スクリーンショットを見ての通り、2個目3個目のiframeでは、セッションに格納したfooが取り出せていません。
セッションIDが再生成された継続したセッションではなく、全く新しいセッションが作成されています。
そして、ブラウザでリロードした際は、最後のiframeへのレスポンスで貰ったセッションIDが使われるので、セッション切れとなります。

環境

環境 バージョン
PHP 7.1.1

書いた日

2017年2月19日頃

Googleスプレッドシートで、複数列を合わせてUNIQUE()する

スクリーンショット 2017-02-11 17.36.10

なにか果物とか野菜の生産地が書いてあるシートがあります。生産地は3つまで書ける様になっています。
RDBMSなら正規化が必要な感じだけど、スプレッドシートなら仕方がない。
こういうシートがある時に、生産地1〜3全部から重複を取り除いた生産地が欲しい時の為の、複数列を合わせてUNIQUE()する方法です。

=UNIQUE(TRANSPOSE(SPLIT(JOIN("||", C2:C,D2:D,E2:E),"||")))

C2:C,D2:D,E2:Eで、C列〜E列を合わせてUNIQUEします。ただし、見出しに使っているC1〜E1は除きます。

UNIQUE(C2:E)だと、範囲内の全列が同じ行がユニーク扱い

これだけで出来れば楽だったんだけどUNIQUE()に3列指定すると、3列全てが同じ値でユニークと判別する様です。
この挙動だとダメなのでUNIQUE()を使うには、どうにか3列を1列にまとめる必要があります。

SPLIT(), JOIN()

SPLIT(JOIN("||", C2:C,D2:D,E2:E),"||"))

結構探したんだけど、列というかセル範囲を結合する関数とかが見つからず、仕方ないのでJOIN()して文字列にしてSPLIT()でまた分割する事で、強引に結合しました。
区切り文字は||にしてるけど、値の中に出て来ないものならなんでもいいです。

TRANSPOSE()

SPLIT()すると、分割して横に並べてしまうのでTRANSPOSE()で縦に並べ直します。
これでようやくUNIQUE()出来る様になります。

参考

書いた日

2017年2月11日頃

npmの代替えパッケージマネージャーyarnをインストールしてみた

Yarn

npmの代替えパッケージマネージャー、yarnをインストールしてみました。

  • デフォルトでロックファイルyarn.lockが生成される。
  • パッケージを並列でダウンロードするのでnpmより早くインストール出来る。
  • node_modules内に入るパッケージの重複が少なく、使用容量が小さくなる。

他にも細かい違いはあるけど、こんなところが良いところらしい。
少なくともpackage.jsonはnpmと互換という事なので、1人プロジェクトなら気分次第で、チームのプロジェクトでも合意さえあれば気軽に移行は出来そうです。
まぁ、まずは触ってみないとなので、インストールだけしてみました。

インストール

$ brew install yarn
==> Installing dependencies for yarn: node
==> Installing yarn dependency: node
==> Downloading https://homebrew.bintray.com/bottles/node-7.5.0.yosemite.bottle.tar.gz
##                                                                         4.1%^C

公式サイトでMac OSの場合はHomebrewでとあったので、何も考えずにやったところ、依存解決でnodeも入れ始める。
nodeはnvmで管理してるのでキャンセル。

$ brew info yarn
yarn: stable 0.19.1 (bottled), HEAD
Javascript package manager

https://yarnpkg.com/

Not installed
From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/yarn.rb
==> Dependencies
Required: node ✘

nodeがOptionalかRecommendedなら、と思ったけどRequiredでした。

curl -o- -L https://yarnpkg.com/install.sh | bash

Installation | Yarn

代わりのインストール方法もあったので、そっちに切り替えます。

$ curl -o- -L https://yarnpkg.com/install.sh | bash
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  6742    0  6742    0     0  12641      0 --:--:-- --:--:-- --:--:-- 12625
Installing Yarn!
> Downloading tarball...

[1/2]: https://yarnpkg.com/latest.tar.gz --> /var/folders/sh/nr5ywjrn6_xd3k_87nvxknfr0000gn/T/yarn.tar.gz.XXXXXXXXXX.bpBSuJtT
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    92  100    92    0     0    209      0 --:--:-- --:--:-- --:--:--   210
  0     0    0   595    0     0    343      0 --:--:--  0:00:01 --:--:--   551
100 3416k  100 3416k    0     0   450k      0  0:00:07  0:00:07 --:--:--  884k

[2/2]: https://yarnpkg.com/latest.tar.gz.asc --> /var/folders/sh/nr5ywjrn6_xd3k_87nvxknfr0000gn/T/yarn.tar.gz.XXXXXXXXXX.bpBSuJtT.asc
100    96  100    96    0     0    468      0 --:--:-- --:--:-- --:--:--   468
  0     0    0   600    0     0   1346      0 --:--:-- --:--:-- --:--:--  1346
100   900  100   900    0     0   1424      0 --:--:-- --:--:-- --:--:--  1424
> WARNING: GPG is not installed, integrity can not be verified!
> Extracting to ~/.yarn...
> Adding to $PATH...
> We've added the following to your /Users/myuser/.bashrc
> If this isn't the profile of your current shell then please add the following to your correct profile:

export PATH="$HOME/.yarn/bin:$PATH"

> Successfully installed Yarn 0.19.1! Please open another terminal where the `yarn` command will now be available.

~/.yarnにインストールした様です。
あと.bashrcに追記したと書いてあります。

$ git diff
diff --git a/.bashrc b/.bashrc
index c547b78..be81ef3 100644
--- a/.bashrc
+++ b/.bashrc
@@ -204,3 +204,5 @@ if type complete &>/dev/null; then
   complete -o default -F _yo_completion yo
 fi
 ###-end-yo-completion-###
+
+export PATH="$HOME/.yarn/bin:$PATH"

.bashrcはバージョン管理してるので、あまり勝手に変えてほしくないけど、確かに最後に追記されてました。

$ git diff
diff --git a/.bashrc b/.bashrc
index c547b78..82a70e5 100644
--- a/.bashrc
+++ b/.bashrc
@@ -134,6 +134,9 @@ if this_os_is mac; then
     fi
 fi

+## yarn
+if [ -d $HOME/.yarn/bin ]; then export PATH="$HOME/.yarn/bin:$PATH"; fi
+
 # php-nabe
 if this_os_is mac; then
     if [ -d $HOME/.php-nabe/bin ]; then

yarnが入ってない環境でも問題ない様に、if文を付けて、書く場所もnvm関連の記述の下にしてコミット。

$ yarn
yarn install v0.19.1
info No lockfile found.
[snip]

とりあえずyarnしてみたら、どうやらyarnyarn installするのと同じ意味を持つらしい。npmbrewcomposerみたく、サブコマンドの一覧を出す方が好みなので、いきなり興味が減ってしまいました。
npmがデフォルトでロックファイルを作らないのが嫌だったから、そこはyarnの方が良いんだけどなぁ。
とりあえず気軽に試せる時に試してみようと思います。

npmとyarnのコマンド対応表

Migrating from npm | Yarn

公式ドキュメントにありました。
npmにはパッケージ管理以外のコマンドもあって数が多いせいか、全部が載ってるわけじゃないみたい。

環境

環境 バージョン
node 7.4.0
yarn 0.19.1

書いた日

2017年2月9日頃

インストール済みnpmパッケージとupdateするとどうなるかを確認出来るnpmvetコマンド


harksys/npmvet: A simple CLI tool for vetting npm package versions

JavaScriptのパッケージマネージャーnpmの、インストール済みパッケージのバージョンとpackage.jsonに書いてあるパッケージのバージョンを、見比べるコマンドnpmvetを試してみました。
もちろんnpmvetもnpmパッケージです。

インストール済みパッケージのバージョンだけならnpm list --depth=0で見られます。インストール済みパッケージより新しいバージョンがあるかどうかならnpm outdatedで出るけど、更新がないパッケージは表示されない。という感じで、どちらもちょっと使いにくかったので、npmvetが見たいとこをちゃんと見せてくれて良さそうです。

実行結果

$ npmvet
╔═══════════════════╤═════════════════╤═══════════════════╤════════════╤════════════╗
║ Name              │ Package Version │ Installed Version │ Status     │ Locked     ║
╟───────────────────┼─────────────────┼───────────────────┼────────────┼────────────╢
║ browser-sync      │ 2.18.6          │ 1.9.2             │  Mismatch  │   Locked   ║
╟───────────────────┼─────────────────┼───────────────────┼────────────┼────────────╢
║ gulp              │ 3.9.1           │ 3.8.5             │  Mismatch  │   Locked   ║
╟───────────────────┼─────────────────┼───────────────────┼────────────┼────────────╢
║ gulp-autoprefixer │ 3.1.1           │                   │  Mismatch  │  Unlocked  ║
╟───────────────────┼─────────────────┼───────────────────┼────────────┼────────────╢
║ gulp-cssnano      │ 2.1.2           │                   │  Mismatch  │  Unlocked  ║
╟───────────────────┼─────────────────┼───────────────────┼────────────┼────────────╢
║ gulp-if           │ 2.0.2           │                   │  Mismatch  │  Unlocked  ║
╟───────────────────┼─────────────────┼───────────────────┼────────────┼────────────╢
║ gulp-plumber      │ 1.1.0           │ 1.1.0             │  Matching  │  Unlocked  ║
╟───────────────────┼─────────────────┼───────────────────┼────────────┼────────────╢
║ gulp-postcss      │ 6.3.0           │                   │  Mismatch  │  Unlocked  ║
╟───────────────────┼─────────────────┼───────────────────┼────────────┼────────────╢
║ gulp-sass         │ 3.1.0           │ 2.0.4             │  Mismatch  │  Unlocked  ║
╟───────────────────┼─────────────────┼───────────────────┼────────────┼────────────╢
║ gulp-sourcemaps   │ 2.4.0           │ 1.6.0             │  Mismatch  │   Locked   ║
╟───────────────────┼─────────────────┼───────────────────┼────────────┼────────────╢
║ gulp-tsc          │ 1.2.6           │ 1.1.5             │  Mismatch  │   Locked   ║
╟───────────────────┼─────────────────┼───────────────────┼────────────┼────────────╢
║ minimist          │ 1.2.0           │ 1.2.0             │  Matching  │  Unlocked  ║
╟───────────────────┼─────────────────┼───────────────────┼────────────┼────────────╢
║ tslint            │ 4.4.1           │ 3.3.0             │  Mismatch  │   Locked   ║
╟───────────────────┼─────────────────┼───────────────────┼────────────┼────────────╢
║ typescript        │ 2.1.5           │ 1.7.5             │  Mismatch  │   Locked   ║
╚═══════════════════╧═════════════════╧═══════════════════╧════════════╧════════════╝

中々ちぐはぐな状態ですが、しばらく触ってなかったプロジェクトをgit pullした結果package.jsonが大きく変わってたからだと思います。
そんな時でも、どのパッケージが追加されててnpm updateするとどこまでバージョンが上がるのか、事前に確認できます。

ちなみにLockedは恐らくshrinkwrapとは関係なくpackage.json1.1.1の様に固定のバージョンを書いてるかどうかだと思います。

環境

環境 バージョン
node 7.4.0
npm 4.0.5
npmvet 0.1.2

書いた日

2017年2月9日頃