X68のシェルにfish.xを使っていて、バッチファイル起動すると「環境のためのメモリが足りません」になる件
誰得?な情報ですが、自分用のメモとして。
私の環境ではX68のシェルにfish.xを使用する環境でバッチファイルなどから
SETで環境変数を使用するとなぜか「環境のためのメモリが足りません」になっていました。
fishからバッチファイルを起動することがあまりないので、
ずっと放置していたが、気になったので調べてみました。
COMMAND.Xをサブシェルで起動したときの環境変数の領域が足りないのかと
思っていたら、Human68KのマニュアルでCOMMAND.Xを調べると、
SETコマンドで必要な「環境エリアサイズ」のデフォルト値は512バイトとの事。
環境エリアというのがいまいちピンときませんが、特に指定していないので
512バイトは割り当てられているはず。
にもかかわらず
なんて小さな変数宣言でもエラーになってしまうので、この問題ではなさそうです。
ということで今度はfish.xのマニュアルで「環境エリア」を検索すると、
”起動するコマンド・ファイルに対して fish の環境変数の完全な複製を渡します。
この環境エリアの余白の量はシェル変数 envmargin で制御することができます。”
こちらもいまいちよく分かりませんが、要はコマンド起動した際に現在fishに
設定されている環境変数を引き継ぐという事っぽい。
という事は大量に環境変数を設定していると、デフォルトの環境エリアのサイズが
足りない?だったらenvmarginで余白を追加してやればいいのかな?
という事で.fishrcに以下を設定したら解消しました。
set envmargin=512
512(byte)という値は適当だが、とりあえず解消したのでそういう事なのだろうと思う。
apacheでcookieを書き換える時に注意したいこと
下のサイトに記載されているように、もう間もなくchromeのcookieのSameSite属性の仕様変更が リリースとなります。(2/17時点ではまだの様です)
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の設定は結構情報があるのですが、ライブラリについてはあまり情報がなかったのでメモ。
こちらによると、ライブラリ側で設定した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パターンのビルドができるようになります。
コードからは BuildConfig.API_URL_BASE で現在選択しているProductFlavorに対応する値が取得できます。
尚、Product Flavorに定義する設定名(ここではproduction、develop)は、はbuildTypesに定義しているのと同じ名前は
使用できないらしいです。debug等を指定すると、以下のエラーになりました。
ERROR: ProductFlavor names cannot collide with BuildType names
しかしGoogleのガイド見ても私にはさっぱりわかりませんでした。こういったの理解して開発できる人本当にすごいと思います。
RaSCSIの設定方法を絶対忘れるのでスクリプトにしてみた
最近RaSCSI使い始めましたが、とてもいいですね。
何がいいって、今までXM6TypeGと実機のHDDイメージの同期が面倒だったのですが、
例えばXM6TypeGで更新したHDDイメージをWindowsからRaSCSI側へSCPで簡単に同期できるので、
実機とエミュレータの管理がとても楽になりました。
ただ導入には多少Linuxの知識とコマンド操作が必要なので、それが苦にならなければ
是非お勧めしたいアイテムです。
自分も導入の手順や設定の変更の方法をすぐ忘れてしまうので、導入手順をスクリプトに
まとめてみました。
手順の作成にはIwasaki氏のサイトを参考にさせていただきました、感謝です!
尚、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を再初期化してみた。
ちなみに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が使えるようになりました。