せっかなくので、やってみた。

日々のあんなこと、こんなこと、せっかくなのでやってみた

X68のシェルにfish.xを使っていて、バッチファイル起動すると「環境のためのメモリが足りません」になる件

誰得?な情報ですが、自分用のメモとして。

私の環境ではX68のシェルにfish.xを使用する環境でバッチファイルなどから SETで環境変数を使用するとなぜか「環境のためのメモリが足りません」になっていました。
fishからバッチファイルを起動することがあまりないので、 ずっと放置していたが、気になったので調べてみました。

COMMAND.Xをサブシェルで起動したときの環境変数の領域が足りないのかと 思っていたら、Human68KのマニュアルでCOMMAND.Xを調べると、 SETコマンドで必要な「環境エリアサイズ」のデフォルト値は512バイトとの事。
環境エリアというのがいまいちピンときませんが、特に指定していないので 512バイトは割り当てられているはず。
にもかかわらず

set hoge=HOGE

なんて小さな変数宣言でもエラーになってしまうので、この問題ではなさそうです。

ということで今度はfish.xのマニュアルで「環境エリア」を検索すると、

”起動するコマンド・ファイルに対して fish の環境変数の完全な複製を渡します。
 この環境エリアの余白の量はシェル変数 envmargin で制御することができます。”

こちらもいまいちよく分かりませんが、要はコマンド起動した際に現在fishに 設定されている環境変数を引き継ぐという事っぽい。
という事は大量に環境変数を設定していると、デフォルトの環境エリアのサイズが 足りない?だったらenvmarginで余白を追加してやればいいのかな?

という事で.fishrcに以下を設定したら解消しました。
set envmargin=512
512(byte)という値は適当だが、とりあえず解消したのでそういう事なのだろうと思う。

apacheでcookieを書き換える時に注意したいこと

下のサイトに記載されているように、もう間もなくchromecookieのSameSite属性の仕様変更が リリースとなります。(2/17時点ではまだの様です)

qiita.com

ECサイトなどで外部のカード決済サービスを使用していると、カード決済サービスからECサイトに 戻る際のPOSTリクエストでcookieが送信されず、セッションが引き継がれない問題が発生する可能性があります。

既存のショッピングカートシステムに手を入れられない場合、WEBサーバ側で何とかするしかありませんが、 apacheのmod_headerモジュールが入っていれば、httpd.confなどに以下の様な設定を記述してSameSite属性を付与することができます。

Header edit Set-Cookie ^(Cookie名=.*)$ "$1; SameSite=None;"

注意点として、全てのcookieを変更するのであれば、^(.*)$ で良いのですが、 上記の様に特定のcookieのみ設定を変更する場合は、^(Cookie名)$ではマッチしません。
(Cookie名=hogehoge;の後に、 expires=xxx;やSecureなどの文字列が付加されているためです。)

また、$1; SameSite=None; はダブルクォートで括らないと、

error: envclause should be in the form env=envar

のエラーとなります。 分かってしまえばなんて事はないのですが、エラーメッセージでググってもあまり情報が無かったので忘備録です。

Laravelでユニークインデックスを追加するとmigrate:rollbackできない件

mariadb10.2、laravel5.5で確認。
mysqlでtext型に設定したカラムにユニークインデックスを張ろうとすると、以下のエラーとなってしまいます。

SQLSTATE[42000]: Syntax error or access violation: 1170 BLOB/TEXT column 'hoge' used in key specification without a key length (SQL: alter table `hoge` add unique `hoge_moga_unique`(`moga`))

なので、以下の様に先にtext型をvarchar型に変更する必要があります。

    public function up()
    {
        Schema::table('hoge', function (Blueprint $table) {
            $table->string('moga', 255)->change();
            $table->unique(['moga']);
        });
    }

    public function down()
    {
        Schema::table('hoge', function (Blueprint $table) {
            $table->dropUnique(['moga']);
            $table->text('moga')->change();
        });
    }

これで php artisan migrate は成功するけど、php artisan migrate:rollback しようとするとなぜか同じエラーになってしまう。

 SQLSTATE[42000]: Syntax error or access violation: 1170 BLOB/TEXT column 'mgoa' used in key specification without a key length (SQL: alter table `hoge` add unique `hoge_moga_unique`(`moga`))

どうもdropUnique()と同一トランザクションでtext()->change()しても、dropUnique()した変更が反映されていないみたいです。
以下の様にSchema::tableメソッドを分割することにより、rollbackできるようになりました。

    public function down()
    {
        Schema::table('hoge', function (Blueprint $table) {
            $table->dropUnique(['moga']);
            // 以下でも動作する
            // $table->dropIndex('hoge_moga_unique');
        });
        Schema::table('hoge', function (Blueprint $table) {
            $table->text('moga')->change();
        });
    }

andoridでライブラリモジュールにProduct Flavorを設定するとエラーになってしまう件

andoridのアプリで、共通で使用するライブラリにProduct Flavorを設定すると以下のエラーになってしまう。

ERROR: Unable to resolve dependency for ':app@debug/compileClasspath': Could not resolve project :XXXX
ERROR: Unable to resolve dependency for ':app@debugAndroidTest/compileClasspath': Could not resolve project :XXXX
ERROR: Unable to resolve dependency for ':app@debugUnitTest/compileClasspath': Could not resolve project :XXXX

アプリモジュールのProduct Flavorの設定は結構情報があるのですが、ライブラリについてはあまり情報がなかったのでメモ。

stackoverflow.com

こちらによると、ライブラリ側で設定したProduct Flavorと同じ内容をapp側のbuild.gradleにも記述する必要があるみたいです。
例えば、ライブラリで本番環境と開発環境でAPIのURLを切り替えたい場合は以下の様な記述で動作しました。

ライブラリモジュールのbuild.gradle

android {
    :

    // APIのURL設定
    flavorDimensions "api"
    productFlavors {
        production {
            dimension "api"
            // 本番環境
            buildConfigField "String", "API_URL_BASE", "\"https://production.hoge.moga\""
        }
        develop {
            // 開発環境
            dimension "api"
            buildConfigField "String", "API_URL_BASE", "\"https://develop.hoge.moga\""
        }
    }
}

appモジュールのbuild.gradle

android {
    :

    flavorDimensions "api"
    productFlavors {
        production {
            dimension "api"
            //matchingFallbacks = ["production"]
        }
        develop {
            dimension "api"
            //matchingFallbacks = ["develop"]
        }
    }
}

dependencies {
    :
    implementation project(':hogemogalib')
}

flavorDimensionsはproductFlavorsの各設定を横断的にグループ化する時に使用するらしく、必須項目です。
ここでは1つしか使用していないので、あまり気にせずとりあえずapiという名前を付けています。

アプリ側のmatchingFallbacksをコメントにしていますが、ライブラリ側にしかないproductFlavorsの設定項目を 使用したときにアプリ側で代替で使用する設定名を記述します。
ここではアプリ、ライブラリとも同じ設定項目を記述しているので、特に使用しなくても問題ないっぽいです。

上記の設定でbuildTypesに指定しているrelease/debugとProductFlavorのproduction/developを組み合わせた 4パターンのビルドができるようになります。

f:id:moneci:20200114162346p:plain

コードからは BuildConfig.API_URL_BASE で現在選択しているProductFlavorに対応する値が取得できます。
尚、Product Flavorに定義する設定名(ここではproduction、develop)は、はbuildTypesに定義しているのと同じ名前は 使用できないらしいです。debug等を指定すると、以下のエラーになりました。
ERROR: ProductFlavor names cannot collide with BuildType names

しかしGoogleのガイド見ても私にはさっぱりわかりませんでした。こういったの理解して開発できる人本当にすごいと思います。

developer.android.com

RaSCSIの設定方法を絶対忘れるのでスクリプトにしてみた

最近RaSCSI使い始めましたが、とてもいいですね。
何がいいって、今までXM6TypeGと実機のHDDイメージの同期が面倒だったのですが、
例えばXM6TypeGで更新したHDDイメージをWindowsからRaSCSI側へSCPで簡単に同期できるので、
実機とエミュレータの管理がとても楽になりました。

ただ導入には多少Linuxの知識とコマンド操作が必要なので、それが苦にならなければ 是非お勧めしたいアイテムです。
自分も導入の手順や設定の変更の方法をすぐ忘れてしまうので、導入手順をスクリプトに まとめてみました。 手順の作成にはIwasaki氏のサイトを参考にさせていただきました、感謝です!

www.mushagaeshi.com

尚、shの形式で作成してはいるものの、事前にraspi-configの設定や再起動が必要になるので、 そのままshに流しても動作しません。
"sudo su -"したあと、このスクリプトの各コマンドをコピペしてあげる必要があります。
(自分用に作成したので、ご了承ください。)

#!/bin/sh
# RasPiにRasSCSIを導入するスクリプト
#
# 以下の環境を想定
# RaspberryPi3B
# OSバージョン: buster (Linux version 4.19.75-v7+ )
# RaSCSI: 1.45(fullspec版)
#
# 注意)
# 途中でRasPiの再起動等が必要になるので、そのままshに流しても動作しません。
# "sudo su -"したあと、このスクリプトの各コマンドをコピペしてあげる必要があります。
#
# 事前にIwasaki氏のサイトを参考に以下を作業しておくこと
# https://www.mushagaeshi.com/2018/02/24/howto-setup-rascsi-scsi-device-emulator/
#
# $ sudo raspi-config
# 青い画面のメニューが出てくるので、そこから下記の設定を行う。
#
# ホスト名の変更
# 2 Network Options > N1 Host Name
#  Wi-Fiの設定(pi3は2.4Ghzのみ。pi3+から5Ghz対応)
# 2 Network Options > N2 Wi-Fi
# Select the country: JP
# SSID: <WIFI_SSID>
# Password: <WIFI_PASSWORD>
#
# 地域・エンコーディング設定
# 4 Localization Options > I1 Change Locale
# →ja_JP.UTF-8
# →Default: C.UTF-8 (ja_JPを標準にするとメッセージが化けるので)
#
# タイムゾーン設定
# 4 Localization Options > I2 Change Timezone
# →Asia/Tokyo
#
# キーボードレイアウト
# 4 Localization Options > I3 Change Keyboard Layout
# →使っているもので。USキーボードなら変更不要。
#
# 国設定
# 4 Localization Options > I4 Change Wi-Fi Country
# →JP
#
# 更新
# 8 Update
# →Wi-Fi設定が合っていれば勝手にダウンロードを開始するので待つ。
# もしエラーが出たら上記のWi-Fi設定が間違っているので要再確認
#
# メインメニューからfinishでraspi-config終了後、以下を実行し再起動する。
# sudo apt-get update
# sudo apt-get -y upgrade
# sudo reboot

# 再起動後、ログインして sudo su - を実行してから以下作業

# RaSCSIのインストールアーカイブURL
RASCSI_INSTALLER=http://retropc.net/gimons/rascsi/rascsi145.zip
# RaSCSIのインストール先
RASCSI_PATH=/opt/rascsi
# RaSCSIの動作タイプ aibom fullspec gamernium standard
RASCSI_TYPE=fullspec
# HDSファイル置き場所
HDS_PATH=/var/rascsi/hds
# HDSファイル名
HDS_FILE=cf4g.hds
# RaSCSIのIP
HOST_IP=xx.xx.xx.xx
# RaSCSIのGW
GW_IP=xx.xx.xx.xx
# RaSCSIが参照するDNS
DNS_SERVERS="xx.xx.xx.xx xx.xx.xx.xx"


RASCSI_INSTALLER_FILE=`basename $RASCSI_INSTALLER`

# ヒストリの件数を10000とし、時刻も記録する。
cat <<EOF >> /etc/profile.d/history.sh
export HISTSIZE=10000
export HISTTIMEFORMAT="%F %T "
EOF

# sshd起動
systemctl enable ssh
systemctl start ssh

# eth0のstatic IP設定
[ ! -f /etc/dhcpcd.conf ] && cp -p /etc/dhcpcd.conf /etc/dhcpcd.conf.org
cat <<EOF >> /etc/dhcpcd.conf

interface eth0
static ip_address=$HOST_IP/24
static routers=$GW_IP
static domain_name_servers=$DNS_SERVERS
EOF

# NTPクライアント設定
[ ! -f /etc/systemd/timesyncd.conf.org ] && cp -p /etc/systemd/timesyncd.conf /etc/systemd/timesyncd.conf.org
sed -e 's|#NTP=.*|NTP=ntp.jst.mfeed.ad.jp ntp.nict.jp|' /etc/systemd/timesyncd.conf.org -i
timedatectl set-ntp true
systemctl restart systemd-timesyncd

# RaSCSIインストール
mkdir -p $HDS_PATH
chown root.pi $HDS_PATH
chmod -R g+ws $HDS_PATH

cd /tmp
wget $RASCSI_INSTALLER
cd `dirname $RASCSI_PATH`
unzip /tmp/$RASCSI_INSTALLER_FILE
# rascsi145.zipの拡張子を削除したディレクトリ名にシンボリックリンクを張る
ln -s ${RASCSI_INSTALLER_FILE%.*} $RASCSI_PATH

# 使っていないけどとりあえずhdsのリンクを作成しておく
cd $RASCSI_PATH
ln -s $HDS_PATH .

# rascsi.tar.gzはそのままbinの下に解凍して使う
cd $RASCSI_PATH/bin/raspberrypi
tar zxvf rascsi.tar.gz

# RaSCSI自動起動設定
cat <<EOF > /etc/systemd/system/rascsi.service
[Unit]
Description=RaSCSI
After=syslog.target

[Service]
Type=simple
WorkingDirectory=$RASCSI_PATH/bin/raspberrypi
ExecStart=/usr/bin/sudo $RASCSI_TYPE/rascsi -ID0 $HDS_PATH/$HDS_FILE
TimeoutStopSec=5
StandardOutput=null

[Install]
WantedBy = multi-user.target
EOF

systemctl daemon-reload
systemctl enable rascsi
systemctl start rascsi
# 起動状況の確認
systemctl status rascsi

SourceTreeでgit flowがおかしくなった

既に作業中のリポジトリで、後からGitFlowの初期化をしたところ、
featureブランチが作成されず、developがfeatureブランチと認識されてしまった。

こちらを参考にgit flowを再初期化してみた。

ch.nicovideo.jp

ちなみにWindows10でSourceTreeを使用しているが、いつからかなぜかターミナルを 押してもgit bashが起動しなくなってしまい、git flowのコマンドが打てなくなってしまった。
仕方ないので、

%USERPROFILE%\AppData\Local\Atlassian\SourceTree\git_local\git-cmd.exe

を直接起動し、初期化を実行。

cd [ワークディレクトリ]
git flow init -f

Which branch should be used for bringing forth production releases?
   - develop
   - master
Branch name for production releases: [master]

Which branch should be used for integration of the "next release"?
   - develop
Branch name for "next release" development: [develop]

How to name your supporting branch prefixes?
Feature branches? [] feature/
Bugfix branches? []
Release branches? [] release/
Hotfix branches? [] hotfix/
Support branches? []
Version tag prefix? []
Hooks and filters directory? [ワークディレクトリ/.git/hooks]

masterとdevelopは自動入力されているのでそのままEnter、
"supporting branch prefixes?"は feature/ , release/ , hotfix/ のみ入力して、 その他はデフォルトのままEnterで初期化。

注意点としては、feature/など、最後にスラッシュを入力しておかないと、 SoureTree上で新規フィーチャー開始でブランチ名を入力すると、
「featurehoge」など、残念な結果になってしまう。

以上で、SoureTreeからGitFlowが使えるようになりました。