投稿

PHP の CSV読み込み fgetcsv 疑問まとめ

イメージ
PHPで fgetcsv 使用時の疑問を確認したメモ $file = fopen($filepath, 'r'); while( $csv = fgetcsv($file) ){ print_r($csv); } fclose($file); 改行コード 改行コードは \r\n または \n 単独で存在する \r は通常の文字と同様に扱われる※混入注意 ダブルコーテーション内 戻り値(配列内)にダブルコーテーションは含まれない カンマ, \r\n, \n を含むデータを読み込むことが可能 ダブルコーテーションは、2つ連続で表現 例) "テスト""太郎""" → テスト"太郎" その他 ダブルコーテーションで括る必要がないデータを、括ってもよい ダブルコーテーションで括っていないダブルコーテーション(先頭以外)は、通常の文字として扱われる 例) 1,あいうえお,かき"くけこ → [2]=かき"くけこ スペースは区切りではない(ダブルコーテーションで括る必要なし) カンマ前後のスペースも文字列として取得される(trimされない) 備考 \r = CR(0x0D=13) \n = LF(0x0A=10) Excel の Alt+Enter で入力したセル内の改行は、csv保存で ダブルコーテーション括りの \n となる Excel の csv保存(utf-8)で作成されたファイルは、fgetcsv で読み込める(確認した限り) Excel の csv保存は utf-8とデフォルトエンコード(sjis)が存在するので注意が必要

Macで最小化したウィンドウを元のサイズに戻すショートカットキー

Macで最小化したウィンドウを元のサイズに戻すショートカットキー(ショートカットキーと呼んでいいのかは不明) Windowsの場合 Win+↓等で最小化したウィンドウは、Alt + Tab で選択後 Altを離せば元のサイズに戻るが Mac は command + M で最小化したウィンドウを command + Tab で選択後 command を離しても 最小化されたまま Option長押ししろとかいう記事がを見つけたが現行では反応なし 調べたら command + Tab で選択後、optionを更に押して(command + option)離すとかいう操作でウィンドウを元のサイズに戻せるらしい、が、書いてあるとおりはかなり難しい というか、そこに指がない いろいろ操作してみた結果、command と option は同時に押されていなくても大丈夫そうで command + Tab で選択後、commandに置いた指を隣の option へスライドして 離せ ばOK (操作的にも覚えやすい) キートップの印字が早く消えそうだけど :-)

Evernote10 のローカルDB(sqlite)の断片化を解消

イメージ
Evernote10 のローカルDB(sqlite)を最適化、断片化を解消してみたメモ 対象はデフォルトで下記の場所(エクスプローラへコピペ)の %APPDATA%\Evernote\conduit-storage\https%3A%2F%2Fwww.evernote.com 下記のファイル( 000000 の場所はユーザIDとなっている) UDB-User 000000 +RemoteGraph.sql この作業には sqlite3コマンドが使える環境が必要です 今回は DB Browser for SQLite を使用してますが、何でもよいです Evernote10を終了させ 、DB Browser for SQLite 等で 先程の UDB-User000000+RemoteGraph.sql を開きます まずは、断片化の状況を調べるため、下記のコマンドをそれぞれ実行して値を調べます(SQLを実行タブ) PRAGMA page_size PRAGMA page_count PRAGMA freelist_count 私の値 PRAGMA page_size =  4,096 PRAGMA page_count = 721,697 PRAGMA freelist_count = 565,701 各count にページサイズを掛ければ、実際の容量が得られます 721,697 *  4,096  = 2,956,070,912 (全体のサイズ) 565,701 *  4,096  = 2,317,111,296 (空きサイズ) 78% が空き(断片化?)ということになります ということでデータベースを圧縮(vacuum)します (下の方の最適化も可能ですが、私の環境ではほぼ変化なしでした) ※sql文を保存するか聞いてきますが破棄でよいです(さっきの PRAGMA文のコト) しばらくして(DBサイズやストレージの速度によります)、データベースを圧縮 ウィンドウが閉じられれば完了 私の場合、ファイルサイズが 2,956,070,912(2.9GB) → 610,885,632(610MB) となりました 結果、Evernote10 は、なんとなく速くなったような... ...

Parallels Desktop + Windows11 のアクティベートで認証できない(0x80041014)

mac を入れ替えた(arm系)ため、新しい mac に Parallels Desktop + Windows11 をセットアップし、Windows をアクティベートしようとしたら 0x80041014 で認証できない ※プロダクトキーは、以前の mac(intel系) で Parallels Desktop + Windows11 を構成していたもの この場合、(物理的にもParallels的にも別だけど) Parallels 仮装マシンとして変更があったという位置づけで、プロダクトキーは使用中ということらしい ライセンス認証画面の「プロダクトキーの更新」 ではなく 「トラブルシューティング」の先にある「最近ハードウェアを変更しました」から Microsoft アカウントにログイン 後、以前使用していたマシン(今回の場合、以前の Parallels 仮想マシン)を選択すれば、アクティベート完了となった ちなみに、プロダクトキーは Win8 pro のもの(以前に Win11 pro として利用)で、今回の Win11 arm pro において、そのまま利用できました 参考 https://kb.parallels.com/jp/114051

Delphi で Generics で Interface なリスト IList

Delphi の Generics なリストを interface で作成したい 検索結果のリストを渡すとき等、リストそのものがインターフェイスじゃないので、受け取り側で TList<IHoge> の中身だけ、別のリストへコピーとかになってしまうわけです そこで IList<IHoge> みたいなのがあれば、リストそのものを代入すれば参照カウンタが上がって安全にかつ迅速に引き渡せるハズ 調べたら 型が IInterface に制約される System.Classes. IInterfaceList とかいうのがあるので、THoge(List.Items[I]) のように取り出し時にキャストしてやれば使えます ※リストは参照なので、受け取り側で変更すると受け渡し側へも影響ありです IInterfaceList で OKな方はここまでで完了 Delphi で interface のベースクラスは 「TInterfacedObject を継承してないと参照カウンタは実装されません」とかいう制約がある TList との 多重継承はNGなので、TInterfacedObjectを継承したクラスの中で TList 型の変数を持って、出入り口を作り直せとかいう事らしい(ChatGPTの回答もそれだった) 先程の IInterfaceList も private に FList: TThreadList<IInterface> とかいうリストを持ってました それって Count やら Items やら(無駄に)再定義して、使っていくうちにアレが足りないとかなりそうじゃないですか... ということで、TList をそのまま Itemプロパティとして外部に出してやるという手抜き実装 type IListGen<T> = interface function _GetList: TList<T>; property Item: TList<T> read _GetList; end; TListGen<T> = class(TInterfacedObject, IListGen<T>) private ...

eximoポイ活の「実質」とかいうのが無理すぎw

イメージ
DMでわざわざ送ってきた eximoポイ活の「実質」とかいうのが無理すぎて笑える データ無制限が 実質 2,780円(税別) その内訳が キャンペーン期間中(終了時期未定)に dカードで 50,000円以上買い物 家族3回線以上契約 ドコモ光 or home 5G(dカード ポイント対象外) dカードでドコモ料金支払い(dカード ポイント対象外) 無制限プラン利用で、条件達成のために ドコモ光や home 5G 契約というのは、食べ放題の割引のために食べ放題をもう一つ注文するような感じでしょうか dカードのポイ活そのものが、キャンペーン中のみで、ドコモへの支払い(携帯, ドコモ光, home 5G)は対象外 こんな悲しい条件を考えて、キャンペーンと大々的にDMや広告打って、ご苦労なことです まぁ、引っかかる人がいるからやってんだろうけど

FireDAC(Delphi) でSqlite の Integer(int64) が int32に変換されてしまう

FireDAC(Delphi) でSqlite の Integer(int64)型を取得すると、int32に変換されてしまう AsLargeInt プロパティで取得しても同じ Query.FieldByName('created').Value; Query.FieldByName('created').AsLargeInt; Query.FormatOptions のマッピング変更を行うことで、int64へ切り替え Query := TFDQuery.Create(nil); Query.Connection := FDConnection; Query.FormatOptions.OwnMapRules := True; Query.FormatOptions.MapRules.Add(dtInt32, dtInt64); 参考文献 データ型マッピング(FireDAC) FireDac query not reading large integers correctly