Develop
ソフトウェア開発作業全般
Other
ASCIIFlow: 画面構成図などの作成でテキストなので便利かもしれない。
Project
- オープンソースの開発プロジェクトではコーディング以外のドキュメント化やサポートなどの貢献が特に重要 - GIGAZINE
- オープンソースプロジェクトを有料化して月収100万円の事業家に転身したソフトウェア開発者 - GIGAZINE
名簿付きの寄付
- Vim: https://vim-jp.org/vimdoc-ja/sponsor.html
- Vim (list): https://www.vim.org/sponsor/hall_of_honour.php
- KDE: https://relate.kde.org/
- KDE (list): https://relate.kde.org/civicrm/profile?gid=18&search=0
- Conservancy (list): https://sfconservancy.org/sponsors/
- Conservancy: https://sfconservancy.org/donate/
Design
Atomic Design
最近のUIのコンポーネントの組み方。UIコンポーネントを粒度に分けて、ディレクトリー分けして流用するという考え方。
- atoms: 原子。これ以上分割不能な最小単位。input/label/buttonなど。
- molecules: 分子。atomsを組み合わせたり、atomsに多少修正したもの。入力フォーム、ナビゲーション、カードなど。
- organisms: 有機体。分子+アルファ。入力フォーム+ヘッダーなど。複数の分子。
- templates: テンプレート。複数の有機体。ヘッダー、メイン、フッターなど。
- pages: ページ。テンプレートを使用したページ。
インターフェイスと抽象クラス
PHPでインターフェイスと抽象クラスを使う #PHP - Qiita
- インターフェイスは、クラスに複数実装できるが、抽象クラスは1つしか継承できない。→不特定のクラスで、共通のメソッドを定義したい場合。
- インターフェイスは、実装のあるメソッドを持つことができないが、抽象クラスは、実装のあるメソッドを持つことができる。→抽象クラスは、複数のクラスの、共通処理の中に、一部違う処理が入る場合、プロパティーが必要な場合などに使用する。
インターフェイス
- メソッド宣言のみ。
- static/constの場合に限定して、メソッド定義、定数もOK。
Config class
- c++ - Best practice for creating a 'global' config class used by numerous components - Software Engineering Stack Exchange
- Best way to provide configuration parameters for objects far away from the starting point - Software Engineering Stack Exchange
- design - Config Class/Struct: Pattern or Anti-Pattern? Alternatives? - Software Engineering Stack Exchange
- json - Best practice/design pattern for working with a config file - Software Engineering Stack Exchange
アプリケーションの設定を管理するクラスの設計方法。いくつか方法があり、議論がある。「Best way to provide configuration parameters for objects far away from the starting point - Software Engineering Stack Exchange」で特によく議論されている。
- シングルトン/グローバル変数: ただし、テストなどで並列アクセスが必要な場合に困ることがあるらしい。
- DI/設定クラス引数: これがよく支持されている。テストしやすいなど。グローバル変数への参照を渡すようなイメージ。ただし、依存性の伝播のように、上から下に設定を渡す際に、関係ない大量の設定を渡すことがあったりする。
2のDIが最近の主流。引数で値渡し相当にすれば、並列アクセス時も無影響。伝播の問題は設計の問題。
メソッドをmain関数で呼び出すことを想定して、必要なものだけ渡るようにして、余計なものは削除する。上位・下位の関係を明確にすれば、渡すだけのパラメーターを排除できる。
do-while/if
複雑なif文と相性がいい。
for whileの無限ループで最後にbreakでも同じか
do { if (true) break; } while(false);
if文が複雑な場合、do-whileで囲んで、breakでスキップできる。gotoに近い。
GoF
基本的に、具象クラスを使わずに、インターフェイスや抽象クラスを使ってインスタンスを生成するというのが、共通する基本パターン。
これにより、いろんなケースに同じコードで対応できる。
Factory Methodパターン
なぜあんなに難しい?Factory Methodパターン - ecbeing labs(イーシービーイング・ラボ)
コンストラクターの代わりに、インスタンスを生成 (工場=factory) となるメソッドを使うから、FactoryMethodパターン。
引数の内容に応じて、異なるクラスを作成する。
ただ、Factory Methodパターンを採用すると、コード量が増えて複雑になる。
複雑でややこしいだけなので、基本的に使わなくてよいと思う。
Naming
getMyVariable() vs myVariable()
- naming conventions - PHP methods: getMyVariable() vs myVariable() - Stack Overflow
- Which Coding convention to follow for PHP? - Stack Overflow
getterとsetterの命名規則。
getVar()にするか、Var()にするか。C++だと後者のパターンがあったりする。getを省略できるので、省スペースになる。
ただ、コード補完で探しやすさがちょっと変わる。getを前置したほうがわかりやすいか。
Regular Expression
正規表現。重要。覚えにくいが重要なものをメモしておく。
後ろからマッチ。cが置換対象。
/[^c]*$/: cより右端
glob
重要。正規表現とは似ているが異なる、パターンマッチング記法 (Pattern Matching Notation)。主に、globで採用されており、ディレクトリー・ファイルのマッチングで使われる。
使用可能な記号は以下3個。以下の3文字は\でエスケープできる。
- ?: 任意の1文字にマッチ。
- *: 任意の0以上の文字にマッチ。
- [: []内の1文字にマッチ。正規表現の各括弧と同じ。ただし、先頭の否定が^ではなく、!。
ファイル名マッチ時には、追加で特殊なルールがある。
.から始まるファイル名へのマッチには、.が必要。つまり、*?は先頭の.にはマッチしない。[!a] のような否定形の各括弧記法も.にはマッチしない。加えて、先頭の[.]もマッチするかは不定(unspecified)。
globで.ファイルを含めたい場合、工夫が必要 (PHP: glob - Manual)。
.[!.]* *
上記のように.ファイルのマッチとそれ以外を指定する必要がある。
.[!.]*
は、.
と..
以外の..
始まりのファイルにマッチする。
.*
を指定すると、.
/..
がマッチするので注意する。最近のシェルは、シェル側で気を利かせているようで、.*
だと.
/..
はマッチしない。
引用符のネスト
シェルやプログラミング言語で、文字列リテラルの表現などで、一重引用符'と二重引用符"を使う。
JSON作成や変数展開などで、これらをネストさせたいことがある。その基本的な考え方を整理する。
交互にしていい場合は簡単二重。引用符内に一重引用符を配置、一重引用符内に二重引用符を配置すればいい。
問題はこれがNGな場合。特にありがちなのが、JSONの生成。JSONの引用符は二重引用符のみ。一重引用符の中だと、二重引用符の変数展開が使用不能。外側を二重引用符にする必要がある。
二重引用符は、内部で変数展開が可能。この都合で、バックスラッシュ\によるエスケープが有効。
基本的な方法。
- 既存の一重/二重引用符などをバックスラッシュでエスケープ。
- 全体を一重/二重引用符で囲む。
何かAwkの本か何かで、基本的な考え方の説明の記載があった気がする。
[{"ke\y":"valu\e"}] を例として考える。
- {"ke\y":"valu\e"}
- エスケープ: {\"ke\\y\":\"valu\\e\"}
- 全体囲み: "{\"ke\\y\":\"valu\\e\"}"
これでOK。また何か考慮不足があればそのときに考える。
ただ、元データに修正が必要なので、そのまま行きたい。ヒアドキュメント的なものが使えるならそれを使うのがいい。
例えば、シェルなら、catコマンドとコマンド置換で生テキストを使える。
echo $(cat <<-'EOT' {"ke\y":"valu\e"} EOT )
.envなどで使える技?いや使えない。.envではシンプルなコマンドしか使えず、ヒアドキュメントは使えない模様。
- How to escape double quotes in JSON - Stack Overflow
- python - How to handle double quotes in JSON value? - Stack Overflow
JSONのvalue部分に適用したい場合。データの二重引用符をバックスラッシュでエスケープする。これはこうするしかない。JSONが二重引用符しか認めないから。
基本的な考え方がある。
- JSON value用に二重引用符"を\"で置換。
- \"がPHP/JavaScriptで二重引用符に扱いにならないように、\を\\に置換。
- JSON項目の二重引用符"を\"で置換。
- 全体を二重引用符"で囲む。
こういう感じ。JSONはawkでも任意の最終データで考える。途中にプログラミング言語でのパースがあるので、それを考慮する必要がある。
タイムゾーン
3文字形式は避けたほうが無難。
タイムゾーン名で判定する実装があるので、UTC-9なども避けたほうがいい。
tz databaseのAsia/Tokyoなどの確実性が高い。
Kanboard
クローズ時に自動移動
[Configure project]-[Automatic actions]
- action=[Move the task to another project]
- Event name=Closing a task
- Column=Done
- Project=
これでDoneをclose時にアーカイブ用のプロジェクトに移動できる。
Modelio
クラス図
- 汎化 (generalization): 実線白矢印。継承。
- 実現 (realization): 点線矢印。interfaceの継承。
- 集約: 白ひし形。
- コンポジション: 黒ひし形。子が単体で存在できない場合。親と生存期間が同一の場合。
- 関連: 実線矢印。メソッド内インスタンスなど。
- 依存: 点線矢印。引数やローカル変数、返却値。
Communication
Skype
すべてのエモーティコンのリストはありますか? - Microsoft サポート
Skyepで使用可能な絵文字の一覧。
AI
対話AI
List
【2024年版】対話型AIサービスおすすめ11選を徹底比較!チャットボットとの違い・メリット・課題・選び方なども紹介 - NotePM
いろいろある。
Name | |||
---|---|---|---|
Bing | |||
Perplexity AI | |||
ChatGPT | |||
Google Gemini |
ChatGPT
Plan
Free/Plusの2のプランがある。
Free | Plus | |
---|---|---|
金額 [USD/月] | 0 | 20 |
機能 | 基本 | アーリーアクセス |
エンジン | GPT-4o mini | GPT-4/GPT-4o/GPT-4o mini |
制限 | - | GPT-4oの5倍以上のメッセージ送信 |
その他 | - | データ分析、ファイルアップロード、ビジョン、Webブラウジング |
画像生成 | - | DALL-E |
送信可能なメッセージ数、エンジン、画像生成などが大きな違いだろう。
VCS
Git
差分ファイル抽出
情報源: gitで差分ファイルを抽出する #Git - Qiita。
git archiveとgit diffを組み合わせる。
git archive --format=zip --prefix=root/ HEAD `git diff --diff-filter=d --name-only HEAD^ HEAD` -o archive.zip
ただし、この方法はファイル数がARG_MAX以下の場合だけ。ファイル数が多い場合だめ。
git diff --name-onlyで一覧を出力させて、1個ずつcp -pで階層を維持してコピーするしかないかも?
例:
mkdir -p archive git diff --name-only new_base 44765_upgrade-base-version | xargs -i cp -p --parent "{}" archive/
マージコミット後のコミット追加
マージコミット後に次の開発作業を始めることが多い。が、直後の初回のコミットを追加したい場合困る。
git rebase -iにすると、コミットが残るから。編集はできるが、その直前にコミットの追加ができない。マージコミットは扱いが特殊で直接rebaseで編集できない。
しかたないので、該当コミットでブランチを作成して、コミット。その後、既存の修正ブランチをrebaseでそのコミットの後にくっつける。これでいける。
core.autocrlf
warning: in the working copy of 'docker/README.md', LF will be replaced by CRLF the next time Git touches it
Windowsでは改行にCR+LFを使うが、mac/LinuxはLFのみ。これの違いの処理のための設定がcore.autoclrlf
- true=コミット時にCRLFをLFに自動変換。チェックアウト時に逆。Windows向けの設定。
- false=変換しない。
- input=コミット時にCRLFをLFに自動変換のみ。mac/Linux向け。Windowsではチェックアウト時にCRLFになるが、mac/LinuxはLFになる。
わかりにくい。基本はfalseで良いと思われる。
gitkの文字化け対策
gitkのエンコーディングを設定する - Pistolfly
gitkはシステムのデフォルトエンコーディングで表示しようとするので、文字エンコーディングを指定しておく。
git config --global gui.encoding utf-8
ファイル名などの文字化け対策
Git for Windows で日本語を使いたい #Vim - Qiita
git config --global core.quotepath false git config --global gui.encoding utf-8
改名と修正
改名と修正を同時にすると、改名を検知できない。
-Mオプションを指定すると、類似度で同時も検知できる。が、基本はリネーム・改名と修正は別コミットにしたほうがよさそう。
差分無視
git diffの--ignoreオプションにおけるスペース、タブ、改行の扱いを理解する #Git - Qiita
-wでインデント違いを無視してくれる。
squash
squashすると、squash対象コミットが、対象の直前のコミットに含められる。
gitignore
Format
記述方法を整理する。
- 空行は無視。
- #始まりの行はコメント扱い。
- 終端スペースは無視。
- !接頭辞はパターン否定。つまり、除外ではなく含める。以前除外された一致を再び含める。ただし、親ディレクトリーが除外されている場合、以下のファイルは含められない。パフォーマンス上の理由。順番に注意する。
- /はディレクトリー区切りとして使用。先頭、中間、末尾で登場する。
- 先頭と中間の/は相対パスを意味する。
- それ以外、末尾の/と/なしの場合、現在以下のディレクトリーにもマッチする。
- 末尾が/で終わる場合、ディレクトリーのみに一致。/がない場合、ディレクトリーとファイルの両方に一致。
- *は/以外にマッチ。?は/以外の任意の1文字にマッチ。[a-zA-Z] の範囲記法も使用可能。fnmatch(3) FNM_PATHNAMEフラグのパス名展開に準じる。
- **は特殊な意味がある。
- **/=全ディレクトリー。**/fooは配下の全fooにマッチ。**/foo/barはfoo以下の全barにマッチ。
- /**=配下のすべてにマッチ。
- a/**/b=a/b a/x/b a/x/y/bのすべてにマッチ。
後は特に明記がないが、上から順番に評価されて、最後のマッチが優先されるので、記述の順番に注意する。
反転の!と/の扱いに特に注意が必要。
先頭スラッシュをつけないと、再帰的になる。
$ cat .gitignore # ディレクトリ foo/bar 以外のすべてを除外 /* !/foo /foo/* !/foo/bar
空ディレクトリーの維持
How do I add an empty directory to a Git repository? - Stack Overflow
gitは空ディレクトリーを履歴管理できない。何かファイルが必要。
logなど維持したい空ディレクトリーに、以下の内容の.gitignoreを置く。
!.gitignore
.gitignore以外を無視する。これで.gitignoreのみがあるので管理できる。
指定ファイルのみ除外
* !.gitignore
ディレクトリーを残す以外 (.gitignore1ファイル以外) に、サンプルファイルなど複数ファイルを残したい場合は、上記のように*で最初に全部除外して指定ファイルのみ含める。/は必要に応じてつける。
gitattributes
Git - gitattributes Documentation
gitignoreに似ていて、パターンにマッチしたパスに対する設定を行える。
- text
- eol
- working-tree-encoding
- ident
- filter
- diff
- merge
- conflict-marker-size
- whitespace
- export-ignore: git archiveなどに含めないことをマーク。
- export-subst
- delta
- encoding
過去コミットのメールアドレスの変更
- How can I change the author (name / email) of a commit? | Learn Version Control with Git
- Gitのcommitの名前やメールアドレスを過去からまとめて変更する
単一コミットのメールアドレスを指定する場合、commitに--authorを指定する。
git commit --author="John Doe <john@doe.org>"
--amendと併用することで、過去コミットも変更できる。
数が少ないなら、rebase -iで1個ずつamendする。数が多いならfilter-branch。
第一コミットの変更
- [Git 最初のコミットを含めてrebase -iする方法 | DevelopersIO]
- Git - git-rebase Documentation
通常、第一コミットはammend以外では変更できない。
rebase --root [branch] でブランチの第一コミットも参照して改変可能。
ファイルのインデックスのみ削除
git rmは単独だと、gitの履歴とローカルファイルからも削除する。追跡対象から削除のみで、ローカルファイルとして残したい場合、--cachedを指定する。
git rm --cached
GitHub
Account
Username may only contain alphanumeric characters or single hyphens, and cannot begin or end with a hyphen.
ユーザー名は、英数字と-のみが使用可能。
組織別にアカウントを分けるなら、かぶらないように末尾に-組織名のようなサフィックスがあるとよいだろう。
Fossil
外部依存を排除しており、CGIでも動作するという点が非常に良い。気になる。Phorgeの検討が不要になる。
Phorge
PhorgeはPhabricatorのフォーク。
About
Introduction
以下が主な機能。
- コードレビューツール=Differential
- リポジトリーブラウザー=Diffusion
- バグトラッカー=Maniphest
- ウィキ=Phiriction
GitHubの自己ホスト。
Phabricator
PhabricatorはもともとFacebook社内のBTSシステム。PHP製。2021-06-01に開発終了。
主なユーザー。
- AngularJS
- Discord
Install
Self Host with IPv6rs - IPv6 Provider - How to Install Phorge on Ubuntu Server Latest
Requirement
LAMP環境で動作する。
共用ホストでも動作するが、一部機能しない。通常コンピューターを推奨している。
- MySQL: 5.5以上。
- PHP 7.2以上
- git: 2.5.0以上。
- PHP extension: mbstring, iconv, mysql (or mysqli), curl, pcntl
ドメインはサブディレクトリーはだめで、サブドメインじゃないとダメ。
Download
以下のコマンドで取得する。
$ cd somewhere/ # pick some install directory somewhere/ $ git clone https://we.phorge.it/source/arcanist.git somewhere/ $ git clone https://we.phorge.it/source/phorge.git
gitの設定。
$ sudo git config --system --add safe.directory somewhere/arcanist $ sudo git config --system --add safe.directory somewhere/phorge
phorge用のDBを作っておく。
cp /var/www/html/phorge/phabricator/conf/local/local.json.example /var/www/html/phorge/phabricator/conf/local/local.json
"mysql.host": "localhost", "mysql.user": "phorge", "mysql.pass": "password", "mysql.port": 3306, "mysql.charset": "utf8", "mysql.database": "phorgedb"
後は開くだけ。
Config
以下のコマンドでユーザーを認識させる。
phorge/ $ ./bin/storage upgrade --user <user> --password <password>
Diffusion
Hosting
◉ Diffusion User Guide: Repository Hosting
Shell
ワイルドカード
ワイルドカードで.始まりのファイルをマッチさせたい。
以下ならマッチするが、ブレース展開 (brace expansion) はPOSIX shでは使えなかった気がする。
echo {.*,*}
BOM
unicode - Adding BOM to UTF-8 files - Stack Overflow
ExcelでUTF-8ファイルを開けるように、UTF-8のBOMをファイルにつけたい。
printf '\xEF\xBB\xBF' > with_bom.txt
上記コードでBOMを最初に書き込んで、後は追記する。
awk
The Open Group Base Specifications Issue 7
変数
特別
- NF: 列数。列の全表示などで使う基本的で重要な変数。
- NR: 行番号。
スコープ
関数の仮引数のみ、ローカル変数扱いで、それ以外はグローバル変数。
文/statement
- actions
- if/else
- while/do...while/for
- break/continue
- delete
- next
- exit
- output
- printf
関数
組込関数
- Arithmetic
- atan2
- cos
- sin
- exp
- log
- sqrt
- int
- rand
- srand
- String
- gsub
- index
- length
- match
- split
- sprintf
- sub
- substr
- tolower
- toupper
- I/O
- close
- getline
- system
print/printfは関数ではなく、statement/文扱い。
ヘッダー出力、列別最大長さ出力。
awk -F, '{if(NR==1) print $0} {for(i=1; i<=NF; ++i){if (line[i] < length($i)) line[i] = length($i)}} END {for (i=1; i<=NF; ++i) {printf line[i]","}}' data/101542.csv
CSV
シェルスクリプトの実験のために作った POSIX 準拠 awk 実装の CSVパーサー (RFC4180対応) #ShellScript - Qiita
# csvparser.awk
## Usage
# awk -f csvparser.awk data.csv
# CSV の論理的な一行毎に呼び出されるコールバック関数(サンプル)
# row: 行番号(最初の行は1) len: フィールド数 fields: フィールドデータ
function callback(row, len, fields, col, field) {
for ( col = 1; col <= len; col++ ) {
field = fields[col]
gsub(/\\/, "&&", field) # \ は \\ にエスケープする
gsub(/\n/, "\\n", field) # 改行は \n にエスケープする
print row ":" col " " field
}
}
BEGIN { row = max_idx = 0 }
{
idx = 0
sub(/\r$/, "")
while ($0 != "") {
if (match($0, /^(["]([^"]|["]["])*["]|[^,"]*)(,|$)/)) {
fields[++idx] = ""
} else if (match($0, /^["]/)) {
fields[++idx] = substr($0, 2)
for (;;) {
if (getline == 0) exit 1
sub(/\r$/, "")
if (match($0, /^([^"]|["]["])*["](,|$)/)) break
gsub(/["]["]/, "\"")
fields[idx] = fields[idx] "\n" $0
}
fields[idx] = fields[idx] "\n"
} else {
exit 1
}
field = substr($0, RSTART, RLENGTH)
$0 = substr($0, RSTART + RLENGTH)
lastcomma = sub(/,$/, "", field) > 0
gsub(/^["]|["]$/, "", field) && gsub(/["]["]/, "\"", field)
fields[idx] = fields[idx] field
}
if (lastcomma) fields[++idx] = ""
while (idx < max_idx) delete fields[max_idx--]
callback(++row, idx, fields)
max_idx = idx
}
awkのCSVパーサー。
Other
binary
POSIX準拠のシェルスクリプトでバイナリデータを扱う #Bash - Qiita
バイナリーデータの読込はodコマンド。なければhexdump。
書込はprintf。
head/tailの-cはPOSIXで使えたか?
cmd.exe
bitsadmin
Windowsでのファイルダウンロードコマンド
Windows 7以降ではbitsadminコマンドがあり、これがwget相当となる。
書式:
bitsadmin /transfer <job name> <URL> <output path>
<job name>と<output path>は必須なので注意する。
certutil
Windowsでのハッシュの確認に使える。
certutil -hashfile file
SHA1 ハッシュ (対象 C:\moconavi\windows\Moconavi\ext\chromium\moconavium.exe): e0da85b04b6970ac1f0c33db7a9ad607fdbd44eb CertUtil: -hashfile コマンドは正常に完了しました。
rlogin.cmd
コマンドキーの送信を自動化できる?
rem rlogin.cmd @Echo off Set SERVER=192.168.0.0 Set USERNAME= Set PASSWORD= Cmdkey /generic:TERMSRV/%SERVER% /user:%USERNAME% /pass:%PASSWORD% Start mstsc /v:%SERVER% Timeout 5 Cmdkey /delete:TERMSRV/%SERVER%
実行中プロセスのパスの確認
出典: Show EXE file path of running processes on the command-line in Windows - Super User。
wmic process get ProcessID,ExecutablePath wmic process where "name='mysqld.exe'" get ProcessID, ExecutablePath wmic process where "name='mysqld.exe'" get ProcessID, ExecutablePath /FORMAT:LIST
簡易編集モード/挿入モード
- 【Tips】Windows 10のコマンドプロンプトが意図せず止まってしまう問題を回避する方法 | ソフトアンテナ
- Windows command prompt freezing randomly - Super User
Windows 10のcmd.exeは [簡易編集モード] が有効になっており、コマンドプロンプトを左クリックすると、テキストの選択が始まる。テキスト選択中はコマンドの実行が止まる。長時間かかるコマンドの実行中に誤操作で止まると困るので、これは無効にしたほうがよい。
cmd.exeを起動-左上のアイコンをクリック-[規定値]/[プロパティ]-[オプション]-[□簡易編集モード] を選ぶ。
そのほか、 git log
のような制御が移るコマンドを実行してしばらくすると、操作できなくなる。
[□挿入モード] にすると回避できる模様。
Web
HTTP
Content-Disposition
Content-Disposition - HTTP | MDN
RFC 6266 - Use of the Content-Disposition Header Field in the Hypertext Transfer Protocol (HTTP)
Content-Disposition: inline Content-Disposition: attachment Content-Disposition: attachment; filename="filename.jpg"
filenameでファイル名を指定する。ここの値は二重引用符で囲む。スペースを含む場合に必須になる。
multipart/form-data
rfc7578
ファイルアップロード用のMIME type。
リクエストヘッダー
Content-Type: multipart/form-data; boundary=--hogehoge
リクエストボディー
--hogehoge Content-Disposition: form-data; name="user_name" Content-Type: text/plain test --hogehoge Content-Disposition: form-data; name="email" sample@mail.com --hogehoge Content-Disposition: form-data; name="gender" male --hogehoge Content-Disposition: form-data; name="user_profile" filename="image.jpeg" Content-Type: image/jpeg \xff\xd8\.... --hogehoge--
ヘッダーでmultipart/form-dataを明記して、ボディーでデータを指定する。
curlでの送信理由。
-Fで送信データをname=data形式で指定する。ファイルの内容を指定する場合、@filenameで指定する。これを指定すると、リクエストボディーのfilename扱いにしてくれる模様。-Fを指定すると、-H 'Content-Type: multipart/form-data'が自動付与される。たぶん、-dと同様に-X POSTもつく。
curl -X POST -F file1=@/var/tmp/sample.jpg https://xxxxx.net/xxxxxx
データとテキストを同時送信したい場合、-Fで複数指定する。
curl -X POST -F 'age=30' -F file1=@/var/tmp/sample.jpg https://xxxxx.net/xxxxxx
curlだと上記のboundaryなどをうまくやってくれるのだと思う。
リクエストボディー全体をファイルデータにする場合。
curl -X POST -H 'Content-Type: image/jpeg' --data-binary @/var/tmp/sample.jpg https://xxxxx.net/xxxxxx
IP address
出典: 固定IPアドレスの取得方法 ~実は簡単!フリーランスの方も必見です~|VPN活用日記|トピックス|グローカルネットの快適VPN【公式】| 株式会社グローカルネット。
自宅サーバーを行う際、固定IPアドレスが必要になる。
取得方法がいくつかある。
- 契約しているプロバイダでオプションとして申し込む方法
- 固定IPアドレスに対応しているSIMを契約する方法
- VPNを利用した固定IPアドレスの提供会社を利用する方法
VPNの固定IPアドレスが安いらしい。ryoかsuwakoが解説していた気がする。
Authentication
認証方式がいくつかある。HTTPで定義される認証方式 (HTTP認証) が有名。
Basic認証
出典: Basic認証 - Wikipedia。
Authorization HTTPヘッダーにBasicのあとに [username:password] をBASE64でエンコードして送信する認証方式。
GET /private/index.html HTTP/1.1 Host: example.com Authorization: Basic cm9vdDpwYXNzd29yZA==
盗聴や改ざんが簡単だが、シンプルという利点がある。
OAuth
Ref
OAuth (オーオース) 権限の認可のための標準。OAuth 2.0が最新の標準。
以下が登場人物。
- resource owner: あるサイトのユーザー。
- resource server: あるサイトのユーザーのデータの保有サーバー。
- clent: クライアントアプリ。リソースサーバーのデータを使用したい。
- authorization server: クライアントにサイトへのアクセスを認証するサーバー。アクセストークンを発行して行う。
アクセストークンが実質的なパスワードのようなものだが、resource serverのパスワードを直接渡していない点が重要な違い。パスワードを直接渡さないことで、機能別に権限を細かく利用可否を制御できる。
処理の流れ。
- client->resource owner: Authorization Request。ここでユーザーが手操作でアクセスを承認する。
- client<-resource owner: Authorization Grant。
- client->authorization server: Authorization Grant。承認された情報でアクセストークンを要求。
- client<-authorization server: Access Token
- client->resource server: Access Token。アクセストークンでアクセス。
- client<-resource server: Access Token
Consumer Key/Secret: アプリ識別用のID/PW。
Access Token: サイトにアクセスするためのパスワード。
API
複数レコードの登録
複数レコードの登録・更新・削除のREST APIについて調べてみた話(+@ Graph API) - junode | 個人開発ブログ
既存のAPIは単一リソースの処理しかないことが多い。JavaScriptなどで単一リソースを何回も呼べばいいというのはそうだけど、JavaScriptなしでは動作しない。一括処理用のAPIを作るしかなくないか?
REST WebAPIのプラクティス | yamarkz.com
delete_bulkなどのような一括処理用のAPIを作るしかない。内部的には単一処理のAPIを作る感じだったとしても。
パラメーター
json - REST API Best practices: args in query string vs in request body - Stack Overflow
パラメーターの指定に3種類ある。
- リクエストボディー
- クエリー
- パス
パスはIDなどを指定する場合だけわかりやすい。それ以外のオプションはクエリーのほうがいい。
ボディーは、通常サーバーのアップロード・ダウンロードデータとして使われる。クエリーはデータの指定に使う。
この原則に従うとシンプルだろう。
- URIには長さの制限がある。
- ボディー
- 引数が非常に多い場合。
- 画像などバイナリーデータ。
- キー・値構造を持たない場合。
- クエリー文字列
- 引数を簡単に確認できる。
- 共通の引数の場合。
検索機能のGET/POST
検索機能にGETとPOSTのどちらを使うか?という議論がある。
データ登録するわけなじゃないのだから、GETがいいんじゃない?
POSTだと、JSONをそのまま送れるので、複雑なケースに対応できる。特に、配列の送信が重要。
GETのほうが検索条件をブックマークにできたり、URLを共有できるので、基本は便利。
レート制限対策
いろいろ方法がある。
- cronなどでデータをサーバー上 (DBなど) に定期保存して、保存データを表示させる。
- 配列を利用して、1回のリクエストでまとめて取得する。
- インターバルを設ける。
- HTTP 429/413を検知して、リトライする。
指数関数的バックオフ
- APIレート制限は何か、どのように対処するのか?
- Exponential backoff - Wikipedia
- 指数バックオフ | Memorystore for Redis | Google Cloud
- バックオフパターンで再試行 - AWS 規範ガイダンスリトライ時は以下のアルゴリズムがいいらしい。
wait_interval = base * 2^n +/- jitter
wait_interval
は、API が HTTP 429 で応答した場合に、システムがリクエストを再試行するまでの時間となります。base
は最初の間隔、つまり最初の再試行までの待ち時間です。この値には3000msを使用することをお勧めします。n
は、現在の呼び出しの前にリクエストが通らなかった数です。複数のスレッドやプロセスを使用して並行してAPIを呼び出している場合、n
の値は現在のスレッド/プロセスにスコープされます。この値は、現在のスレッド/プロセスが、最後に成功した応答から何回 429 "Too Many Requests" エラーに遭遇したかを表します。jitter
は 0 からbase
の間の乱数です。これは、複数のスレッド/プロセスが全く同時にAPIを呼び出さないように、リクエストを少しずつ分散させるために使用されます。システムが待機するたびに、この乱数値を再計算しwait_interval
の合計に加算するか減算するか、ランダムで選択してください。
curl
HTTPの通信のコマンドラインでの確認でよく使う。
Basic
- -X: メソッド指定
- -d/--data-urlencode: リクエストボディー (key=value)を指定。-X POSTも自動指定になる。
curl -H "Content-Type: application/json" -d '{"name":"佐藤", "mail":"sato@example.com"}' localhost:5000/api/v1/users
JSONで送信する場合、ヘッダー指定が必須。
*-F: multipart/formのform指定。
curl -F "coolfiles=@fil1.gif;type=image/gif,fil2.txt,fil3.html" http://www.example.com/postit.cgi
@でfilename相当の指定。;でmime typeも指定できる。
@/</;type=自体を送信したい場合、-Fではなく、--form-stringを指定する。
curl: (60) SSL certificate problem: self-signed certificate
Ref: curlで「自己署名証明書」を受け入れるには【curl: (60) SSL certificate problem: self signed certificate】 | LFI.
--insecureオプションを指定すると、localhostなどでの自己署名証明書を許可する。
curl: Failed writing body
以下のようにhead -n 1を指定するとcurlがエラーを出力する。
curl -H "Content-Type: application/json; charset=utf-8" -H "X-HD-apitoken:$TOKEN" -d "{\"dbSchemaId\":$dbSchemaId, \"limit\":1, \"offset\":$offset}" https://$DOMAIN/$ACCOUNT/api/csvexport/version/1.0 | head -n 1
curl: Failed writing body
curlは標準出力に全部書き込めたかチェックしているようで、head -n 1で切り捨てたらcurlはエラーになる。
対策は、curl -sで出力を抑制するとのこと。これで解決。
Wireshark
TLS
Ref: SSL/TLSの復号#1 ~Wiresharkの設定~ | 東陽テクニカ | “はかる”技術で未来を創る | ワン・テクノロジーズ・カンパニー.
Wiresharkで通信パケットを確認する場合、デフォルトでTLSで暗号化されているので、内容がわからない。WiresharkでTLSに対応しておく必要がある。
[Preferences]-[Protocols]-[TCP] を選ぶ。
- ☑Allow subdissector to reassemble TCP stream
- ☑Reassemble out-of-order semgemnts
上記をチェックしておく。デフォルトでチェックされていた。
続いて、セッションごとのPre-Master Secretを登録する。
Chrome/Firefoxだと、環境変数SSLKEYLOGFILEを設定すれば、このファイルにTLSセッションキーを出力するので、これをWiresharkで読み込むことで、復号対応する。
以下のコマンド相当で、任意のファイル・場所にログファイルを指定する。
export SSLKEYLOGFILE=/tmp/sslkey.log
Macだとlaunchctlで設定しておくといい。これでWebブラウザー経由の場合は見えるようになる。
Security
DoS攻撃
いくつか対策方法がある。
サーバーログにIPアドレスが残るから、それで攻撃元の国を特定して、該当国を一括アクセス拒否。これが効果あるかもしれない。
攻撃元の国は途上国とかが多いだろうから。IPアドレスは簡単に変更できるが、国を変えるのはたいへんだろう。
バリデーションの実装
基本的に、バックエンドで主にチェックして、フロントエンドはUXの向上目的で実装する。データの重複チェックはDBアクセスが必要だったりするから。また、API経由などフロントがそもそもないケースもある。
ただ、社内システムのような、画面経由でしか使わない。悪者がほぼいないと思われるケースは、フロントエンドでの検証だけでも十分に感じる。
二重送信
submitボタンのダブルクリック、リロード、ブラウザーバック・フォワードなど、フォーム周りで注意が必要な保安要素がある。
- ボタン連打
- ブラウザーバック
- リロード (PRG)
項目ごとにすべき対策が異なる。
連打
- フォームの二重送信を防止する方法 - 福岡・東京のシステム開発会社 (株)ユーフィット
- さいきょうの二重サブミット対策 #JavaScript - Qiita
- JavaScriptを利用してフォームの二重送信を防止する|CodeZine(コードジン)
- JavaScriptでformの2重送信を防止する | にせサギ ネットサギ体験ブログ
- Javascriptで送信ボタン二度押しによる二重送信を防止する方法 | Yuta Ihara.com
基本は、ボタンのsubmitのイベント内でdisabled=trueでの無効化。
似た考え方で、スプラッシュのモーダル表示もあり。これがわかりやすいかもしれない。
$("form").submit(function() { var self = this; $(":submit", self).prop("disabled", true); setTimeout(function() { $(":submit", self).prop("disabled", false); }, 10000); });
停止にしたら、二度通せなくなるので、タイムアウトで戻すとよい。
Browser
Chromium
Extension
Chromme系で愛用拡張機能を列挙する。
devtool/開発者ツール
イベントリスナー
[Elements]-[Event Listeners]-[handler]-右クリック-[Show function definition] でイベントリスナー関数の定義を確認できる。
イベント監視
How to find out which JavaScript events fired? - Stack Overflow
monitorEvent関数で監視できるらしい。他に、FirefoxのFirebugのlog eventsでも監視できるらしい。
Other
Windows Safari
一応ある。2012-05-09のSafari 5.1.7までWindows版が提供されていた。DL1531。
Other
Tool
いくつかWeb関係の開発で役立つツール集を公開しているサイトがある。
localhost
RFC 6761 で規定。RFC 2606で予約。DNSに登録されることはないため、テスト目的で使用可能。ループバック (送信元にそのまま返す) インターフェイス。
IPv4=127.0.0.1/IPv6=::1とされている。
Free
無料で使用可能な共用ホスティングサービスがある。
スタードメイン無料サーバー
ドメインをセットで利用する必要があるものの、スタードメインのスタードメイン無料サーバーがけっこういい。
無料レンタルサーバー | スタードメイン - ドメイン取得 100円(税込)~
jpドメインの金額が相場の中では安い方で、それに無料サーバーがついていくる点。
- ディスク容量 20GB
- DB 1GB
ただし、SSHやコマンドは使えないので、FTPでWordPressを展開して設置するとか、そういう簡単な使い方だけ。ただ、それでもWordPressでWebサイトを構築するくらいなら十分だと思う。
CORESERVER
メール
- Custom_Filter_of_Coreserver - PukiWiki
- スパムフィルターの設定 | マニュアル | サポート | レンタルサーバー CORESERVER(コアサーバー)
- カスタムフィルターの設定 | マニュアル | サポート | レンタルサーバー CORESERVER(コアサーバー)
情報
- CoreServer_Mail_Custom - PukiWiki
- coreserverのメール設定:BWT Lab.:SSブログ
- バリューサーバーのフィルター設定でスパムメール(迷惑メール)対策する方法 - QWERTY.WORK
- コアサーバー V1にてカスタムフィルターで「ごみ箱」を指定したときの確認方法 – AWMTの、できるかな?
ルールが特殊なので注意する。
ゴミ箱に振り分ける場合。
順1 で[./.Trash
] を指定
順2
- 条件: [
.*
] - 処理:
./
、に振り分ける
条件部分には正規表現が使えるように見える。
破棄にしないといけない。転送する場合、カスタムフィルターの中に転送を入れる。条件を.*にする。
カスタムフィルターにくせがある。
- エスケープ(\を前置する)が必要な文字は「'」「"」「|」「`」「~」「?」「!」
Value Domain ネットde診断 byGMO
2024-06-07 Friからバリュードメイン系の利用者に無料で提供しているセキュリティー診断ツール。
Analytics
Tool
サイト分析用のツールがいくつかある (2023年ブログランキング!おすすめブログランキングサイト比較【一般人向け】)。
- SimilarWeb
- Ubersuggest
- ahrefs
- Googleキーワードプランナー
閲覧数取得
出典: GoogleAnalyticsで自サイトの人気記事ランキングを表示する方法 | アフィリエイトJAPAN。
- [行動]-[サイトコンテンツ]-[全てのページ]
- [表示する行数]=5000
- [エクスポート]=TSV
流入元特定
「会員登録画面の流入元探索方法について - Google アナリティクス コミュニティ」どのページから会員登録があったか、会員登録に結びつく記事は非常に重要。
こんにちは。
探索レポートでユーザーセグメントを作成する集計方法はいかがでしょうか。
・自由形式レポートを作成
・セグメント作成 > ユーザーセグメント
・条件は page_view > パラメータ page_location > 含む:会員登録画面のURL を指定
・「会員登録画面閲覧ユーザー」などセグメント名をセットして保存
・探索レポートにセグメントを適用
・ディメンション:セッションの参照元 / メディア、ランディング ページ + クエリ文字列
・指標:セッション
ご確認よろしくお願いいたします。
※ページ閲覧の発生しなかったセッションはランディングページが (not set)になります。
開きっぱなしのタブから再訪問するセッションなどが該当します。ご参考までに。
PMProでも似たような回答。
Google Analytics 4 can track ecommerce conversions and then assign page value to posts that were a part of their conversion path for that engaged session.
Server
httpd
Apache HTTP Server
Access Control
出典: Access Control - Apache HTTP Server Version 2.4。
DoS攻撃対策などで重要な設定。
mod_authz_core/mod_authz_hostがコアモジュール。mod_rewriteも関係ある。
基本構文は以下。
Require host <address> Require ip <ip address>
1番目の形式はドメイン名。2番目はIPアドレス。部分マッチする。マッチしたもののアクセスを許可する。
Requireの直後にnotを指定してアクセス禁止にできる。こちらが重要。
[サーバーIPがブラックリストに載ってメール送信エラーになるのを解除する方法]
MailHog: Go言語製のメールサーバーソフト。
Debian
PHP8
[How To Install PHP 8.0 on Debian 11/10/9 | ComputingForGeeks](https://computingforgeeks.com/how-to-install-php-on-debian-linux/)
Debian 11の場合、PHP 8には外部リポジトリーが必要なので追加する。
sudo apt update
sudo apt install -y lsb-release ca-certificates apt-transport-https software-properties-common gnupg2
PHPパッケージを追加する。
echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/sury-php.list
wget -qO - https://packages.sury.org/php/apt.gpg | sudo apt-key add -
sudo apt update
これでPHP8を参照できるので、インストールする。
sudo apt install php8.2
[How to Switch between Multiple PHP Version on Debian 12/11/10 – TecAdmin](https://tecadmin.net/switch-between-multiple-php-version-on-debian/)
インストールしたら、PHPのバージョンを切り替える。
a2dismod php7.4
a2enmod php8.2
sudo systemctl restart apache2
php 8.2にするとこういうエラー。
[Sat Sep 02 11:31:02.558029 2023] [php:error] [pid 25644] [client 133.106.38.37:57181] PHP Fatal error: Uncaught Error: Undefined constant "DB_DATAOBJECT_ERROR_NODATA" in /var/www/gnusocial/public/index.php:104\nStack trace:\n#0 [internal function]: handleError()\n#1 {main}\n thrown in /var/www/gnusocial/public/index.php on line 104
念のためdockerで起動を試みましたが、同じくトップ画面を開くと同じエラーになります。
<https://notabug.org/gnusocialjp/gnusocial/src/main/docker/development> にDockerでの起動方法があります。`docker compose up -d` を実行するだけでlocalhostでアクセスできます。
私とあなたとの環境の違いを排除したいので、dockerのインストールだけ頑張って、それでdockerでも簡単に動作確認してくれませんか?
alternative
Ref: DebianAlternatives - Debian Wiki.
OS内でバージョン違いのプログラムを管理するための仕組みがある。それがupdate-alternativesコマンド。
sudo update-alternatives --display vi
sudo update-alternatives --config vi
オプションとコマンド名を指定することで、現在の実体と更新ができる。
XAMPP
ポート番号変更
XAMPP Control PanelのConfigから変更可能。
phpmyadminはConfigのphpmyadminで、Servers.portを追加する。
cron
About
UNIX系OSのジョブ管理ツール。タスクの定期実行を可能にする。
cronの名前は時間を意味するギリシア語chronosに由来する。
指定した時間に1回だけ実行するなら、atがある。電子メールの送信などで役立つ。
Format
cronの動作はcrontab (cron table) ファイルで指定する。
以下の形式になっている。
# ┌───────────── 分(0〜59) # │ ┌───────────── 時(0〜23) # │ │ ┌───────────── 日(1〜31) # │ │ │ ┌───────────── 月(1〜12)JAN-DEC # │ │ │ │ ┌───────────── 曜日(0〜6〈日〜土〉、一部のシステムでは7も日曜日) SUN-SAT # │ │ │ │ │ # │ │ │ │ │ # * * * * * [予約するコマンド]
日時部分はいくつか指定方法がある。
- *: すべて。
- */n: nごとに実行 (*/5)。
- ,: 複数の時間間隔を指定 (1,2,3)
- -: 範囲。
- %: コマンド内の%はエスケープされていないと改行文字に変換され、標準入力としてコマンドに渡される。
ユーザーはcrontab -eで自分の設定ファイルを編集できる。crontabファイルの直接編集は非推奨で、crontabコマンドでの修正が推奨されている。
Command
- 編集: crontab -e
- 表示: crontab -l
- 削除: crontab -r
-u: 実行ユーザー指定。
Log
/var/log/cron
cron - Verify if crontab works - Ask Ubuntu
デーモン自体の確認は以下。
systemctl status cron systemctl restart cron
Visual Studio Code
Keybind
矩形選択
Ref: VS Codeの矩形選択と矩形貼付の操作方法 - mito’s blog.
- s-alt-クリック
- c-s-alt-矢印
ジャンプ
- 括弧ジャンプ: C-S-\
Config
Default terminal
Ref: bash - Change the default terminal in Visual Studio Code - Stack Overflow.
[F1]-[Terminal: Select Default Profile]
cscope
cscope用のプラグインが何個かある。
scope4codeのほうがいろいろできそうだが、うまく動作しなかった。使い方がよくわからない。
cscope-codeはシンプルだが動作した。こちらを当分使うことにする。
Macの場合、control-. sのように、control-.の後に、controlを話してsを押すと発動する。カーソル下のシンボルしか使えない感じなのがネック。まあいい。
Vim
VSCodedでVimのキー操作を使うためのプラグイン。これが一番人気。いや、Vimのエミューレーターは中途半端な感じだから使わないほうがいいかな。
Extension
CSS
Tailwind CSS IntelliSense
PHP
Laravel Blade Snippets
PHP Intelephense
Ref: PHP Intelephense - Visual Studio Marketplace.
VSCodeのPHPの補完拡張として人気が高い。
Quick Start
設置後、しておくべき設定がある。
- Go to
Extensions
. - Search for
@builtin php
- Disable
PHP Language Features
. LeavePHP Language Basics
enabled for syntax highlighting.
VSCodeの [PHP Language Features] を無効にしておくとのこと。
後は、.php以外の拡張子でPHPファイルがあれば、関連付けを追加するとか。
Module
peclなどPHPの標準モジュールで一部認識できないものがある。
「php - Undefined type 'Imagick' in VSCode's intelephense - Stack Overflow」にあるように、そういう場合は [Settings]-[Stubs] で追加するとよい。
Coding
Ref: VSCode で PHP 開発するならインテリセンス最強の intelephense を使おう | 株式会社ビヨンド.
intelephenseでコード補完を認識しやすい書き方というのがある。
まず、型をつけられるものはつける。
function superMethod()
{
/** @var AwesomeService $awesomeService */
$awesomeService = $this->app->make(AwesomeService::class);
$awesomeService->awesomeMethod();
}
ローカル変数も型名を指定する。これをしないと、インスタンスでコード補完が効かない。
Office
Font
いくつか愛用しているフォントがある。
- IPAexフォントおよびIPAフォントについて | 一般社団法人 文字情報技術促進協議会: 日本語の日本公式フォント。IPAexMincho/IPAexGothic。
- Miguフォント : M+とIPAの合成フォント: Miguフォント。Migu 1C/Migu1M。IPAフォントとM+フォントの合成。半濁点の視認性が高かったり、コーディング用フォントとして手堅い。
日本語と英語でフォントを分けられないソフトがあったりするので、必然的に日本語フォントが優先される。
- 明朝体: IPAexMinch
- ゴシック: Migu 1C
- 等幅: Migu 1M
- スライド: Migu 1C
以前はスライド用にMigMix 1P/Migu 1Pを使っていた。視認性が高いから。その後、2011-04-18にMigu 1Cとさらに視認性を重視したフォントが生まれた (変更履歴 : M+とIPAの合成フォント)。Migu 1Cでいい。
Spreadsheet
文字数ソート
エクセル 文字数 多い順 並び替え -エクセルの列の並び替えなのです- Excel(エクセル) | 教えて!goo
=IF(A2="","",LEN(A2))
そのままではできないので、作業用シートを作る。
Cell
空判定
ISBLANK 関数を使用すると、結果は false になります - Microsoft 365 Apps | Microsoft Learn
Excelの話。
ISBLANKは空文字の場合、FALSEになる。
セルの空白判定に役立つ関数がいくつかある。
- ISBLANK=空白の場合。
- ISERR=N/A以外のエラーの場合。
- ISERROR=エラーの場合。
- ISNA=N/Aの場合。
- ISNONTEXT=空白セルと、文字以外のセル。
空文字の場合、ISBLANK=FALSE、ISERR/ISERROR/ISNONTEXT=TRUEになる。
これを利用して、(ISBLANK || ISERR)にすると、空白を判定できると思われる。
文字列
表計算ソフトで、文字列リテラルは、二重引用符で囲む。一重引用符はNG。文字列として二重引用符を使う場合、二重引用符内で、二重にする。
デフォルト値
- Logical operators in Excel: equal to, not equal to, greater than, less than
- Default values in table cells - Microsoft Community
- Create conditional formulas - Microsoft Support
- worksheet function - In Excel, can I provide a "default value" in case my formula returns #NA? - Super User
IF関数でやるしかない。条件演算子、Null合体演算子、OR/||などは使えない。
IFERRORに近い機能がある。
先頭の一重引用符
Excelでは先頭の一重引用符 (アポストロフィー) はセルが文字列であることを示す特殊なマーク扱い。
先頭の一重引用符を残したい場合、工夫が必要。
- 一重引用符を二重にする ('text')。
- 先頭を=で始める (="'text'")。
=で始めると末尾の"の削除も必要になる。一重引用符の二重がシンプル。
Excel
オートシェイプの全選択
Ref: シート上の図形(オートシェイプ)を全て選択した状態にするショートカットキー【エクセルTips】
[C-g]-[セル選択]-[オブジェクト]
日付の数値対策
【Excel】入力した日付が5桁の数字になるのを防ぐ「書式設定」の確認方法 | 特選街web
Excelの日付が数字になるときの対処法 - [その他 + その他 ぺんたん info]
日付のデータが5桁の数字になって困ることがある。
これはセルの書式設定が、[標準] や [数値] になっているから。[日付] に変更すれば解決する。
セル参照、数式の場合は、TEXT関数で表示形式を指定する必要がある。"yyyy-mm-dd"を指定しておくとよいだろう。
ファイルのインポート
- テキスト (.txt または .csv) ファイルのインポートまたはエクスポート - Microsoft サポート
- 【簡単】セル内改行を含むCSVをExcelにインポートする方法。PowerQueryで列ずれなし。 | 実践で使うExcelとAccessの話
複数のCSVをシートごとにインポートして、整理したいことがある。単にCSVを開くだけだとやりにくい。
[データ]-[テキストまたは CSV から]-CSVファイルを選択-[インポート]-[データの変換]
CSVに改行が入っていると、崩れる。インポート時に設定がある。
[適用したステップ]-[ソース] をダブルクリック-[改行]=[引用符で囲まれた改行を無視] を選択-[OK]-[閉じて読み込む]。
データの変換時に、列の型も指定できる。全部文字列にすると、エラーなく全部読込はできる。
R1C1参照形式
列の表示が数字になってしまったのを、元のアルファベットに戻したい。|中小企業ソリューション|キヤノン
列を番号で表示して確認したいことがある。
[ファイル]-[オプション]-[数式]-[数式の処理]-[□R1C1参照形式を使用する]
これをオンにする。
Cell
大量セルのオートフィル
Excelで大量行のオートフィルを一気にしたい。|カルフ / Ph.D / メーカー研究職
- まずベースとなる範囲を選択。
- [ホーム]-[検索と選択]-[ジャンプ] (C-g)。
- オートフィルの端のセル番地を指定して、Shiftを押下したままOK
- [ホーム-[フィル]-[連続データの作成]-[オートフィル]-[OK]
最大値位置の取得
【Excel】エクセルにて最大値や最小値のセルの場所(番号)を検索する方法【セル位置の取得】 | モアイライフ(more E life)
=MATCH(MAX($A$1:$A$11),A1:A11,0)
MATCHで (最大) 値のセルを検索する。
ゼロの非表示
空セルを参照したり、一部の計算結果が空白になる場合、0が表示されることがある。
いくつか方法がある。
[ツール]-[オプション]-[表示]-[ゼロ値のチェックを外す]
=IF(Sheet1!A1="","",Sheet1!A1)
置換
文字列を置き換えるREPLACE関数とSUBSTITUTE関数 | ノンプログラミングWebアプリ作成ツール - Forguncy(フォーガンシー)| メシウス株式会社
- REPLACE: 文字位置を指定した置換。
- SUBSTITUTE: 文字の置換。
SUBSTITUTEは重宝する。
Word
キーワード変数
【Word】文書中に何度も登場する文字列を1か所変更するだけで他の箇所も一括で変更する方法 | My Life 8
例えば契約書などで、同じ氏名や住所が同一文書内に複数回登場することがある。一箇所変更すれば、全体も反映されるようにしたい。
ブックマークと相互参照を利用する。
- まずどこかで後で流用したい文字列を入力しておく (文書の先頭などわかりやすいだろう)。
- 登録対象文字列を選択して [挿入]-ブックマーク] を選び、わかりやすい名前でブックマークに登録する。
- 以後の登録した文字列を使いたい場所で、[挿入]-[相互参照] で先に登録したブックマークの参照を配置する。
- 文字列を一括置換したい場合、最初に登録したブックマークの文字列を別のものに変更する。
LibreOffice Draw
テキストボックスの内部余白
text box internal margins - how to set them - English - Ask LibreOffice
テキストボックスに二重に余白がある。内部余白は、[Format]-[Text Attributes...] から変更可能。
グリッド
図形の配置でグリッドとスナップが重要。
グリッドの間隔類は、[Preferences]-[LibreOffice Draw]-[Grid] で設定する。
[Resolution] がグリッド (点) の表示間隔。その横の [Subdivision] はグリッド同士の細分化個数。グリッドをあまり細かくしすぎると、目が疲れる。
例えば、グリッドを1間隔にして、subdivisionを2にすると、0.5間隔でグリッドの間をスナップできる。
LibreOffice Calc
e-taFormula
evaluate
- worksheet function - LibreOffice Calc equivalent to Excel "Evaluate Formula" feature - Super User
- Is it possible to convert a text string to a formula? - English - Ask LibreOffice
- Evaluate math expressions - English - Ask LibreOffice
- Apache OpenOffice Community Forum - [Solved Evaluate a string - (View topic)]
セル内のテキストを数式として評価してほしい場面に遭遇した。
例えば、画素数 (720x720) の合計。Excelだとevaluateという関数があるが、Calcにはない。マクロなどで頑張る。あるいは、数式ではないがF9で数式に変換できるらしい。
General
Naming
RFC
- webmaster
- support
- info
- service
- pr
- billing
- 氏名
売上をアップするメールアドレス、商機を失うメールアドレス | マイナビニュース
infoやwebmasterなど企業サイトが備えるべきメールボックスのルール、ご存じですか? | 編集長ブログ―安田英久 | Web担当者Forum
rfc-jp.nic.ad.jp/rfc-jp/RFC2142-JP.txt
SuperTAINS News No.23 [Page.5]
【Mail】メールアドレス作成のガイドライン(RFC2142) – fumidzuki
公開用のメールアドレス。何にしようか考えていた。
RFC 2142でいくつか推奨されている。
info@ support@ answer@ inquery@ contact@ pubic@
contact@がやっぱり一番しっくりくる。info@ support@はRFC 2142にあるけど,これはビジネスより,サービスに紐付いたもの。個人でやる分にはサービス関係ないから,これは違う。publicも悪くはないのだけど,あまり一般的ではないか。
develop
GNU social JP管理人 (gnusocialjp@gnusocial.jp)'s status on Saturday, 08-Oct-2022 23:13:28 JSTGNU social JP管理人 使用するメールアドレスに悩みます。GitのメールアドレスはGitのホスティングサービスに掲載され一般公開されます。
メーリングリストのメールアドレスも、返信方法によって引用されアーカイブで一般公開されます。
どう使い分けるのがよいでしょうか?案↓
GNU social JP管理人 (gnusocialjp@gnusocial.jp)'s status on Saturday, 08-Oct-2022 23:20:04 JSTGNU social JP管理人 開発用のメールなので、1がいいですかね。仮に漏洩しても開発関係経由というのがわかるので。
- develop@domainのようなアドレスで共有
- develop@, ml@ で用途別
- contact@ で一般公開用で共有
1がいいと思う。
category
目的に応じて使い分けたほうがよさそう。
メールアドレスを何個ぐらい使い分けたら安全・快適に過ごせるのか - Dr.ウーパのコンピュータ備忘録
メールアドレス流出時の被害防止
不審なメールの検知
必要な数
- 銀行・証券会社
- 知り合い
- ショッピングサイト
その他
- Webサイトなどの公開用
- 本名でのやり取り
- ニックネーム
- 金銭のやり取りのないサービス登録
- 金銭のやり取りのあるサービス登録
- 登録にメールアドレスが必要だけど,そんなに使っていないメール
メールアドレスの種類
- フリーメール
- プロバイダーメール
- 独自ドメイン
メールアドレスの種類とアフィリエイトにおける3つの使い分け方法 | アフィリエイト
- サービス登録用
- メルマガ購読用(捨てアド)
- メインアドレス
メールアドレスの使い分けかた(前編) - 学習する機械、学習しない人間
メールアドレスの使い分けかた(後編) - 学習する機械、学習しない人間
これらを考えてどういう名前で何個用意するかを考える。
とりあえずメインで使うmainというアドレスを一つ用意する。残りをどうするか。
Webサイト公開用にcontact
- main: メインで使うメール。人に直接教えるときや,お金が絡む場合,ショッピングサイトなど実名が求められるような重要な内容にはこれ。こちらから送信するときもこれ。相手の顔が見えているとき。
- contact:受信専用,公開用。問い合わせ用。なんかフォーラムやブログのコメント欄やcontact usなどにこちらから問い合わせる時なども。相手の顔が見えないときなど。
- service: 基本的に受信専用,たまに返信。Webサービス登録用。
- recruit:就職活動用。就職サイトとか転職エージェント,企業とやりとりするときはけっこうメール来るから。
- job: 個人事業、仕事用、不動産は事業なのでこちら。
- money: 金融機関登録用。銀行、証券会社、クレジットカード会社、決済会社・サービス。
- shop/store: ショッピングサイト、個人間売買サイト。
- ユーザー名: メールアドレスの@以前はユーザー名とみなされることがあるので、ユーザー名のアドレスも用意しておくとよさそうだ。
こちらから送信するときのメールアドレス。
Webサービスに登録するときどうするか。不動産屋さんとか人に教えるときはどうするか。アフィリエイトとかドメインとか実名が求められるときはどうするか。
gmailの+を考える。gmailでは+や.をつけると無限にアドレスをつけられる。ただし,受信は+のないメール。
ただし,gmailの+は使えないときがある。@以前の部分をユーザー名とみなして,+を無効な文字とみなすサービスがある模様。
ネットではがきが印刷~郵送できるポスコミ【1枚から注文OK】
https://www.tomtop.com/もだめ。
今まで使ってきたメールとはどうやりくりするか。
Thunderbirdでやる場合,Archiveするときに既読とメールのコピーを行う。
他のアドレスのメールはmainに転送するようにしておいて,mainのメールアドレスで確認。
最終的にThunderbirdでArchiveを実行したら,宛先のメールのフォルダーに同じ内容が既読状態でコピーされることにする。
このようなフィルターを作っておく。受信時にコピーしてしまうと,未読状態でコピーされてしまうか,受信した瞬間に既読状態になってしまい,見逃す可能性が高い。
Manage Identitiesで返信時に受信したアドレスで返信できるように登録しておく。