OmniAICreator/Qiita-1.07M huggingface dataset:
Linux ubuntu bash diffを使わない引数でファイルパスを与え 該当ファイルの内容が一致しているかを確認する

# 目的

- 職場の先輩の思いつきでShellScriptのbashのコーディングを練習した時のコードを展開する。

# 処理概要

- 引数1と引数2のファイル内容を比較する

# 処理詳細条件

- ファイルパスを引数で受け取る
- 二つのファイルの内容が同じ場合OKを出力
- 異なる場合はNGとだけ標準エラー出力で出力
- ファイルが存在しない場合「Not found:[ファイル名]」と標準エラー出力に出力、戻り値を前述のエラーとは別にする
- diff/cmpを使用しないで実施
- 実行マシンでは`crc32`コマンドが実行できる環境である

# 書き方の例

``` shell
path1=${1}
path2=${2}

if [[ ! -f ${path1} ]] ; them
  echo "Not found:" ${path1} 1>&2
  check=1
fi

if [[ ! -f ${path2} ]] ; them
  echo "Not found:" ${path2} 1>&2
  check=1
fi

if [[ ${check} = 1 ]] ; them
  exit 1
fi

CRC32_path1=`crc32 ${path1}`
CRC32_path1=`crc32 ${path2}`

if [[ ${CRC32_path1} = ${CRC32_path2} ]] ; then
  echo "OK"
else
  echo "NG" 1>&2
  exit 2
fi

exit 0
```

# 処理の解説

``` shell
# 引数1(ファイルパス1)を変数path1に格納
path1=${1}
# 引数2(ファイルパス2)を変数path2に格納
path2=${2}

# もしpath1に格納された値がファイルではなかったら
if [[ ! -f ${path1} ]] ; them
  # 「Not found: path1に格納された値」と標準エラー出力でコンソールに出力する
  echo "Not found:" ${path1} 1>&2
  # この先での処理抜け判定で使用する値を変数checkに格納
  check=1
fi

# もしpath2に格納された値がファイルではなかったら
if [[ ! -f ${path2} ]] ; them
  # 「Not found: path2に格納された値」と標準エラー出力でコンソールに出力する
  echo "Not found:" ${path2} 1>&2
  # この先での処理抜け判定で使用する値を変数checkに格納
  check=1
fi

# もし変数checkに1が格納されていたら
if [[ ${check} = 1 ]] ; them
  # 戻り値1を保持して処理を終了する
  exit 1
fi

# 変数path1に格納された値のCRC32の値を取得し結果を変数CRC32_path1に格納する
CRC32_path1=`crc32 ${path1}`
# 変数path2に格納された値のCRC32の値を取得し結果を変数CRC32_path2に格納する
CRC32_path2=`crc32 ${path2}`

# もし変数CRC32_path1に格納されている値と変数CRC32_path2も格納されている値が一致していたら 
if [[ ${CRC32_path1} = ${CRC32_path2} ]] ; then
  # 真の時、コンソールにOKと出力する
  echo "OK"
else
  # 偽の時、「NG」と標準エラー出力でコンソールに出力する
  echo "NG" 1>&2
  # 戻り値2を保持して処理を終了する
  exit 2
fi

# 戻り値0を保持して処理を終了する
exit 0
```
SeleniumでVisualforceページの要素の指定ができなかった原因

## 環境
Classic環境
SeleniumはPythonで動作

## 事象
Visualforceタグで生成した要素をfind_elementで指定した時に、正しいタグのID等で指定しているにも関わらず、null値が戻ってくる。

## 解決策
開発モードを無効化したところ、指定できるようになった。
開発モードを無効化するには、下記URLを参照。
https://developer.salesforce.com/docs/atlas.ja-jp.visualforce_workbook.meta/visualforce_workbook/creating_and_listing_1.htm
[iOS]FirestoreのQueueはFirebaseApp単位で管理してるって知ってた？

Firestoreを使っていると、バックエンドを薄くするためにクライアントサイドで集計処理をしたり、データの更新をしたりすることがあると思います。
弊社も例に漏れず、アプリの起動時にいくつかのクエリを並行して走らせています。
それで特に大きなパフォーマンスの問題もなく動作していたのですが、先日クライアントサイドジョインをガッツリする大きめのクエリを追加したときに事件は起きました。

## なんかクエリめちゃめちゃ詰まってるんだけど
大きいクエリが遅いのは当然なのですが、なんと他のクエリも完全に詰まってホーム画面表示に十数秒かかるような現象が起こりました。
これはまずい、なんとかせねば。

## 原因を特定するぞい
1. Firestore以外からのResponseは即座に返ってきていたので、どうやらFirestoreの問題のようです。

2. 弊社のアプリはAndroid版もリリースしているのですが、そちらでは同様のクエリを走らせても特に大きなパフォーマンスの低下は見られませんでした。iOS(もしくはObjective-C)特有の問題のようです。

上記2点から、「firebase-ios-sdkでのDispatchQueueの扱いとかそのへんっぽいなー」という雑な仮説が導かれました。
試しに大きいクエリだけデフォルトのFirestoreインスタンスではなく、独自で名前を付けて初期化したインスタンスで実行してみました。


```swift
//デフォルトのインスタンス
Firestore.firestore()

//独自インスタンス　今回はこっちを使用
lazy var myFirebaseApp: FirebaseApp = {
    if let app = FirebaseApp.app(name: "Hoge") {
        return app
    }
    return FirebaseApp.configure(name: "Hoge", options: FirebaseOptions.defaultOptions()!)
}()
    
lazy var myFirestore: Firestore = {
    return Firestore.firestore(app: myFirebaseApp)
}()
```

一発大正解で、クエリの詰まりが劇的に改善されました。

## 「動くからOK！」 → 駄目です
やっぱりちゃんと確証を得たいですよね。ドキュメントに目を通したけどそれらしい記述が見当たらないのでソースを読むことに。

いましたいました。
https://github.com/firebase/firebase-ios-sdk/blob/c5b5a44603ad1452a9caef1b26e58ed7fb050d2b/Firestore/Source/API/FSTFirestoreComponent.mm#L97

```objc
std::string queue_name{"com.google.firebase.firestore"};
if (!self.app.isDefaultApp) {
    absl::StrAppend(&queue_name, ".", util::MakeString(self.app.name));
}

auto executor = absl::make_unique<ExecutorLibdispatch>(
    dispatch_queue_create(queue_name.c_str(), DISPATCH_QUEUE_SERIAL));
auto workerQueue = absl::make_unique<AsyncQueue>(std::move(executor));
```

渡したのがデフォルトインスタンスでなければ渡された名前を元にqueue名をつけてdispatch_queue_createしてますね。
やはりQueueの管理はFirebaseApp単位になるようです。

## まとめ
バックグラウンドで重いクエリを走らせるときは独自インスタンスを利用すると良いかもしれません。
注意点としては、
・Authの管理もFirebaseApp単位なので別途SignInが必要
・あんまりポコポコ増やすと管理・デバッグがしんどくなるかも？
あたりかなと思います。

弊社ではデフォルトインスタンスとバックグラウンド用の独自インスタンスの2つ、最小限に絞って利用していこうと思います。
素人がiPhoneアプリを作った話＜全体のページ機能 ＞

#やりたかったこと 

+ マルチページでページ切り替え時にリロード
    + リロードをトリガーにしてRSSを読み込み
    + リロードをトリガーにしてSNSタイムライン読み込み
    
+ マルチページで下にボタンを並べ、回転してもページサイズが長くても同じ位置にボタンが配置されたままになる

+ なるべく楽をする
    + JavaScriptとJavaの区別すらつかない状態で始めたので、Scriptをなるべく自分で書かずにすむ方法が必要だった

#できたこと 

+ AppGyverでページを作ってみる
    + 簡単というところが逆に私には難しく、その後の作業が全く繋がらなかった
    
+ MonacaのOnsenUI + AngularJSでページを作ってみる
    + 何とかできた 

#できなかったこと 

+ Monacaに決めて、AngularJSのマルチページにしたところ、タブ切り替えでリロードさせることができなかった

+ マルチページは諦めたがそのために回転時の横長レイアウトと、スクロールするページのtabbarがつけられなかった

+ ons-tabbarは非常に便利だったし、AngularJSのマルチページのレイヤーの考え方も理解しやすかったが、ページとして読み込むものは最初の1回だけなので、それをどうやってトリガーをつけてリロードさせるのかがどうしてもわからなかった

##Monaca内でのフォルダー構成
<img width="248" alt="スクリーンショット 2019-09-06 19.12.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193243/cd65c626-3312-c68a-e9dd-aa74f00fa81a.png">

ご覧になればわかる通り、とてもシンプルに作っています。
Cordovaのデバッガのバージョンアップにもついていけていない状態ですが…。

次回以降では各ページのできたこととできなかったことをまとめます。
Laravel6.0 新規インストールから認証関連できるまでの手順

```bash

# デモプロジェクト作成
composer global require laravel/installer

# セッションキー作成
php artisan key:generate

# DB接続周り情報変更
.env 変更

#laravel/uiパッケージインストール
composer require laravel/ui

#Generate basic scaffolding
php artisan ui vue

#Generate login / registration scaffolding
php artisan ui vue --auth

# Laravel Mixインストール　＆　Run all Mix tasks　※app.css app.js作成
npm install && npm run dev

# ログイン関連DBテーブル作成
php artisan migrate

#テストサーバー起動
php artisan serve --port=8080

```
Ubuntu 18.04 で GitHub Desktop をインストールする

GitHub の中の人？の shiftkey さんが GitHub Desktop を Linux で動かせるようにしてくださっているので、それをインストールします。

## インストール手順

- [このページ](https://github.com/shiftkey/desktop/releases) を開く
- 各投稿の Assets をクリックして開くと、ファイル一覧が表示される (少し分かりにくい)
- ファイル一覧から .AppImage 形式のファイルをダウンロードする
  - *.AppImage 形式のファイルは、Linux のディストリビューションごとの差異を気にせずに実行できるようにする配布形式です([AppImage の詳しい解説](https://www.virment.com/how-to-use-appimage-linux/))。
- ダウンロードした .AppImage ファイルに実行可能属性を追加して実行する
  - ファイルマネージャから対象ファイルのプロパティを開いて実行可能のチェックボックスを有効にするか、 chmod コマンドで実行可能属性を追加します。
- システムへ統合するか確認するダイアログが表示されるので、統合しておく
  - システムへ統合しておくと、 Ubuntu のアプリ一覧へ追加されます。統合されている場合は、起動中アプリ一覧が表示されているバーの端の「アプリケーションを表示する」ボタンを押すと GitHub Desktop のアイコンが追加されます。
  - AppImage はインストーラではなく実行ファイルなので、移動させたり削除してしまうと起動できなくなります。 ~/AppImages 等のフォルダを作って、移動してから起動する方が良いかもしれません。
- 起動できたら、他の OS 用の GitHub Desktop と同じように使う

## トラブルシューティング

### Clone 時にエラーが出る

curl のエラーが表示されている場合はインストールします。

```bash
sudo apt install curl
```
[Ruby] HTTP ステータスコードを扱うのに WEBrick::HTTPStatus が便利

# WEBrick::HTTPStatus

[WEBrick::HTTPStatus](https://docs.ruby-lang.org/ja/latest/class/WEBrick=3a=3aHTTPStatus.html) は標準添付ライブラリなので Gem なしで使えて便利 :blush:

```rb
WEBrick::HTTPStatus.info?(101)
#=> true
WEBrick::HTTPStatus.reason_phrase(101)
#=> "Switching Protocols"

WEBrick::HTTPStatus.success?(200)
#=> true
WEBrick::HTTPStatus.reason_phrase(200)
#=> "OK"

WEBrick::HTTPStatus.redirect?(301)
#=> true
WEBrick::HTTPStatus.reason_phrase(301)
#=> "Moved Permanently"

WEBrick::HTTPStatus.client_error?(403)
#=> true
WEBrick::HTTPStatus.reason_phrase(403)
#=> "Forbidden"

WEBrick::HTTPStatus.server_error?(500)
#=> true
WEBrick::HTTPStatus.reason_phrase(500)
#=> "Internal Server Error"
```

# 参考

* [module WEBrick::HTTPStatus](https://docs.ruby-lang.org/ja/latest/class/WEBrick=3a=3aHTTPStatus.html)
* [[Wikipedia] HTTPステータスコード](https://ja.wikipedia.org/wiki/HTTP%E3%82%B9%E3%83%86%E3%83%BC%E3%82%BF%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89)
Nerd Fonts Patcherを使って非Nerd-Fontにパッチを当てる方法。

[Vim Deviconsで使えるフォントにするためにnerd-fontsのパッチを当てる。](https://qiita.com/Suzukaze31/items/0e31222e2e000bc54fa4)があまりにも読みにくいので、実行するコマンドだけを抜き出してシンプルにします。

<kbd>その０.確認じゃ！<kbd\>

使いたいfontがすでにpatched-fontsにあるかを確認する。

「https://github.com/ryanoasis/nerd-fonts/tree/master/patched-fonts 」

ない場合は次へ。

<kbd>その１.FontForgeをインストールする。<kbd\>

Menuから「Software Manager」を開いて検索欄に「fontforge」と打ち込み検索するとグレーの「ff」が左右ひっくり返ったようなアイコンの「Fontforge」と言うのが出てくるのでこれをインストールする。

**「Software Manager」がない場合。**
「Synaptic Package Manager」でもインストールできるの「Software Manager」がない場合(Ubuntuなど？)は、「Synaptic Pacage Manager」でインストールする。

<kbd>その２.Nerd Fonts Patcherをダウンロードする。<kbd\>

```
> git clone https://github.com/ryanoasis/nerd-fonts.git 
```
もしくは「https://github.com/ryanoasis/nerd-fonts 」からダウンロードしてHome dirctoryに置く。

<kbd>その３.パッチを当てる。<kbd\>

`font-patcher`が`~/nerd-fonts/font-patcher`、
パッチを当てたいフォントが`/.fonts/Menlo-Regular.ttf`
とする。(font-patcherはpythonファイルです。)

```
> fontforge -script ~/nerd-fonts/font-patcher ~/.fonts/Menlo-Regular.ttf -c
```
で色々

```
Adding 53 Glyphs from Seti-UI + Custom Set 
╢████████████████████████████████████████╟ 100%
Adding 198 Glyphs from Devicons Set 
╢████████████████████████████████████████╟ 100%
Adding 3 Glyphs from Powerline Symbols Set 
╢████████████████████████████████████████╟ 100%
Adding 4 Glyphs from Powerline Symbols Set 
╢████████████████████████████████████████╟ 100%
Adding 1 Glyphs from Powerline Extra Symbols Set 
╢████████████████████████████████████████╟ 100%
Adding 21 Glyphs from Powerline Extra Symbols Set 
╢████████████████████████████████████████╟ 100%
Adding 1 Glyphs from Powerline Extra Symbols Set 
╢████████████████████████████████████████╟ 100%
Adding 8 Glyphs from Powerline Extra Symbols Set 
╢████████████████████████████████████████╟ 100%
Adding 11 Glyphs from Pomicons Set 
╢████████████████████████████████████████╟ 100%
〜〜〜〜〜〜〜〜〜〜いろいろ〜〜〜〜〜〜〜〜〜〜
Generated: Menlo Regular Nerd Font Complete
```
上のようなのが出てきて、
`Generated: Menlo Regular Nerd Font Complete`で完了。`~/nerd-font/`の`Menlo Regular Nerd Font Complete.ttf`がパッチを当てたフォントです。

ちなみに、`-c`は、
https://github.com/ryanoasis/nerd-fonts/blob/master/images/sankey-glyphs-combined-diagram.svg
に書かれてあるicon全てを入れるということです。
`-c`をつけないと例えば、powerlineのiconが使えなかったりするのでまあとにかく、`-c`をつけて実行しましょ。

<kbd>誤字あったらコメントください。<kbd\>
なんということだLaravelでnpm run prod した際に FELIFECYCLEエラーが発生した。



#なんということだ
Laravelでの環境構築をしていて、`npm install`をしてnodo moduleを入れた後、`npm run prod`でコンパイルをしたら、エラーが出た。なんということだ。

#エラーはこちら
```terminal:ターミナル
npm ERR! code ELIFECYCLE
npm ERR! errno 2
npm ERR! @ production: `cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js`
npm ERR! Exit status 2
npm ERR! 
npm ERR! Failed at the @ production script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/ユーザー名/.npm/_logs/2019-09-06T09_06_38_251Z-debug.log
npm ERR! code ELIFECYCLE
npm ERR! errno 2
npm ERR! @ prod: `npm run production`
npm ERR! Exit status 2
```


なんということだ。

#考えたこと
npmで`node_modules`が正しくインストールされていないのではないか。

#よっしゃ！node_modulesもう一回インストールしよ！
```
node_moduleを全部削除する！
rm -rf node_modules

キャッシュが悪さしてるかもしれへんから、削除しておく！
npm cache clear --force

node_modules を全部インストールし直す。
npm install
```

#npm run prod押してみよ！
```
$ npm run prod

 DONE  Compiled successfully
```
圧倒的勝利！

#ビルド方法をまとめておく
```
開発用にビルド
npm run dev 
常時ビルド
npm run watch
本番用にビルド 
npm run prod 
```
Faceware Analyzer のアクティベーションのメモ

## 背景

https://www.facewaretech.com/

Faceware Analyzer は, 2 万円/year で激安の face tracker です.
(Retargetter は 1 万円/year からなので, 合わせても 3 万円からです)

激安になったからか, 基本サポートに問い合わせも放置され反応が悪く, 
アクティベーションの問題に 2 週営業日ほどかけてしまいつらかったので, 記録を残しておきます.
これにより自前で対応できるようにしておきましょう

ついでに 2019 年 5 月ごろにサイトリニューアルがありましたが, Analyzer とかからのヘルプやチュートリアルのリンクが 404 not found になったりしてつらい.

## Analyzer のアクティベーション

https://www.facewaretech.com/

Analyzer Studio を購入した(サブスクリプション契約)とします.

最近(?)のだと, USB ドングルに相当するような, CodeMeter というソフトウェアベースのライセンス管理ツールを PC に入れてライセンス管理します. 

### 同一 PC でライセンスサーバと Analyzer を動かす.

CodeMeter と, Analyzer を動かす PC は一緒でないといけません. いわゆるスタンドアロンライセンス運用のような感じですね.

最初, CodeMeter は別の PC に入れて, ネットワークライセンス認証にしようかと思いましたが(インストールのページにもネットワーク認証せよと書かれていたような), アクティベーションがうまくいきません(いろいろ頑張ればできるようですが, 推奨されない方法らしい)

CodeMeter では WebAdmin でウェブでライセンスの確認などが行えます. 
もしかしたらファイアウォール設定でポートを開ける必要があるかもしれません.
 
### username/password でエラーが出る.

CodeMeter にライセンスをインストールしましたら, さらに Analyzer で, 最初の起動時にアクティベーションが必要です.

ここでは faceware の web ログインの e-mail とパスワードを入力します.

しかし email/pass が正しくても, なぜかエラーがでます.

https://faceware.zendesk.com/hc/en-us/articles/204024225-Why-won-t-my-username-password-work-?mobile_site=true

原因は時刻が合っていなかったからでした(一応 NTP で合わせる設定にはなっていたが, なぜか少し時間がずれていた). Windows の時刻設定をいろいろ設定しなおし, 時刻を合わせることで解決しました.


## TODO

* ネットワーク認証したい(Analyzer を動かすマシンが変わる可能性があるため)
* ソフトウェア(tracking, retargettting だけ必要)だけなら, DynamiXYZ Indy plan のほうがいいかも? 12 万円くらい/年 > http://www.dynamixyz.com/pricing/
【CoreMotion】iPhoneのモーションデータ（加速度や角速度など）をCSVで記録するアプリを作成してみた

# はじめに
iPhoneには加速度センサーや角速度センサー（ジャイロ）といったセンサー類が搭載されており、[Core Motion](https://developer.apple.com/documentation/coremotion)というフレームワークを使うことでこれらのセンサーデータを簡単に取得することができます（機種による違いはありますが）。
モーションセンサーによる行動認識系の論文を見ていると、スマートフォンを使った研究もけっこう多かったりします（お手軽にデータを記録できる端末ということなんでしょう）。

私も[iPhoneから得られたモーションデータを機械学習させたいな](https://qiita.com/FollowTheDarkside/items/e4b1dbb689101c882610)ということでそれらをCSVファイルとして記録する簡易アプリを作成したのですが、せっかくなのでGitHubでも公開しました。注意事項や使い方などはREADMEをご参照ください。

https://github.com/FollowTheDarkside/SensorDataRecorder

今回はシンプルに、CoreMotionの中でも[CMDeviceMotion](https://developer.apple.com/documentation/coremotion/cmdevicemotion)経由で得られる以下の項目に限定しています。

* Attitude（姿勢）
* Rotation Rate（角速度）
* Gravity（重力加速度）
* User Acceleration（加速度）

本記事ではデータの取得部分のコードだけ抜粋して載せておきます。
他にもCoreMotionを使用することで磁気センサーや気圧センサー等のデータも取得可能ですので、興味ある方は良さげに改良してください（すでにそういうのも転がっているかも）。
# モーションデータの取得例
```swift
// CMMotionManagerのインスタンスを生成
let motionManager = CMMotionManager()

// モーションデータの取得を開始
func startSensorUpdates(intervalSeconds:Double) {
    if motionManager.isDeviceMotionAvailable{
        motionManager.deviceMotionUpdateInterval = intervalSeconds
        
        motionManager.startDeviceMotionUpdates(to: OperationQueue.current!, withHandler: {(motion:CMDeviceMotion?, error:Error?) in
            self.getMotionData(deviceMotion: motion!)
            
        })
    }
}

// モーションデータの取得（例としてコンソールへ出力）
func getMotionData(deviceMotion:CMDeviceMotion) {
    print("attitudeX:", deviceMotion.attitude.pitch)
    print("attitudeY:", deviceMotion.attitude.roll)
    print("attitudeZ:", deviceMotion.attitude.yaw)
    print("gyroX:", deviceMotion.rotationRate.x)
    print("gyroY:", deviceMotion.rotationRate.y)
    print("gyroZ:", deviceMotion.rotationRate.z)
    print("gravityX:", deviceMotion.gravity.x)
    print("gravityY:", deviceMotion.gravity.y)
    print("gravityZ:", deviceMotion.gravity.z)
    print("accX:", deviceMotion.userAcceleration.x)
    print("accY:", deviceMotion.userAcceleration.y)
    print("accZ:", deviceMotion.userAcceleration.z)
}
```
intervalSecondsでデータの更新間隔（秒）を指定してあげてください。ちなみにstartDeviceMotionUpdates後はIntervalを変更できないみたいなので、ひとまず今回は変更するたびに毎回stopDeviceMotionUpdatesするようにしてみました（GitHubのコードを参照）。

# おまけ
スマートフォンのセンサーデータの活用には[ZIG SIM](https://zig-project.com)というアプリも便利です。昔に書いたQiita記事でちょっと使わせていただいていたりしています。
https://qiita.com/FollowTheDarkside/items/1a4632ca7c75e2b90127

また、機械学習では靴型のウェアラブルデバイス[ORPHE](https://orphe.shoes)を使ってブレイクダンスの動作識別をしていたりします。よろしければそちらの記事もご覧ください！
https://qiita.com/FollowTheDarkside/items/956b78869d3198982c9c
http://hahaeatora.hateblo.jp/entry/2018/10/14/183000
初心者がHTTPについてまとめてみた

# HTTPについて

HTTPはTCP/IPをベースとしたプロトコルです。

## インターネットのプロトコルについて
インターネットのプロトコルは階層型になっていて、層ごとに抽象化することで下位の具体に左右されることなく上位を実装できる。

* ネットワークインターフェース層
* インターネット層：IP
* トランスポート層：UDP,TCP
* アプリケーション層：HTTP,NTP,SSH,SMTP,DNS

ネットワークインターフェース層は、物理的なケーブルなどに相当する部分です。
インターネット層では実際にデータをパケット単位でやりとりします。
IPではデータを送り出すことだけを保証します。
トランスポート層では、IPが保証しなかった転送部分を保証し、これはTCPが相当します。
TCPでは、接続先にコネクションを張り、データの抜け漏れ等をテェックします。
TCPで接続したコネクションで転送するデータがどのアプリケーションに渡るのかを決定するのがポート番号です。
HTTPはデフォルトで80番を使用します。
アプリケーション層は、具体的なアプリケーションを実現するところです。
TCPでプログラムを作るときはソケットというライブラリを使います。

## HTTPメソッド
メソッドの種類は8つしかありません。

#### GET
指定したURIの情報を取得するメソッドです。
Webページ、画像や動画、フィードなどの取得に使います。
GETはリクエストボディを持たないので、URLの右端に?name=valueのような形で値を送信します。

#### POST
POSTはリクエストボディを持ちます。
フォームの情報の取得などにも使います。
##### 子リソースの作成
あるリソースに対する子リソースを作れます。
##### 既存リソースへのデータの追加
##### 他のメソッドでは対応できない処理

#### PUT
* リソースの更新
* リソースの作成
指定したURIにリソースを保存する。リソースが存在しない場合は、そのURIにリソースを作成する。

#### DELETE
指定したURIのリソースを削除する。

#### HEAD
GETと似ているが、サーバはHTTPヘッダのみを返す。
クライアントはWebページを取得せずともそのWebページが存在するかどうかを確かめられる。

#### OPTIONS
サーバを調査します。
例えば、サーバがサポートしているHTTPバージョンなどを知ることができます。

#### TRACE
サーバはリクエストをレスポンスのデータにコピーして応答します。
サーバまでのネットワーク経路をチェックします。

#### CONNECT
TCPトンネルを接続します。

### 冪等性と安全性
|メソッド|性質|
|:---|:---|
|GET,HEAD|冪等かつ安全|
|PUT,DELET|冪等だが安全でない|
|POST|冪等でも安全でもない|

冪等とは、ある操作を何回行っても結果が同じことです。
安全とは、操作対象のリソースの状態を変化させないことです。
リソースの状態に変化を与えることを副作用というので、安全とは、操作対象のリソースに副作用がないこととも言います。



## HTTPメッセージ
リクエストとレスポンスでやりとりするデータはHTTPメッセージという。
リクエストメッセージはリクエスト行・ヘッダーフィールド・ボディで構成され、レスポンスメッセージは、ステータス行・ヘッダーフィールド・ボディで構成される。

#### リクエスト行
メソッド URI HTTPバージョン
例ー＞’GET /Urizura/uri.uri HTTP/1.0’

#### サーバレスポンス
HTTPバージョン ステータスコード メッセージ
例->’HTTP/1.0 200 OK

#### HTTPヘッダフィールド
ヘッダの各要素は
フィールド名：内容
で構成される。

リクエストヘッダの主なフィールド

|フィールド名|概要|
|:---|:---|
|Accept|クライアントの受け入れ可能コンテンツタイプを示す|
|Authorization| クライアントの認証情報を示す|
|Cookie|クライアントの状態管理情報をサーバに返す|
|Expect|クライアントがサーバに期待する動作をしめす|
|Host|要求しているオブジェクトがあるホストをします|
|Referer|リクエストの出所を示す|
|User-Agent|クライアントのWebブラウザなどの情報をしめす|


レスポンスヘッダの主なフィールド

|フィールド名|概要|
|:--------|:------|
|Accept-Ranges|オブジェクトの一部に対するリクエストをサーバが受け入れ可能かしめす|
|Age|オブジェクトの経過時間を秒単位で返す|
|ETag|オブジェクトのエンティティタグ値|
|Location|オブジェクトの場所|
|Sever|サーバーのベンダー名とバージョン番号|
|Set-Cookie2|サーバがクライアントにCookieを送信するときに用いる|
|Vary|サーバがレスポンス内容を決定する際にリクエストURI以外に用いたヘッダのリスト|

#### HTTPステータスコード
サーバからのレスポンスで、リクエストの結果を返す。
3桁の数字から構成されており、大まかに、100番代は「情報」、200番代は「成功」、300番代は「リダイレクト、400番代は「クライアントエラー」、500番代は「サーバエラー」である。




## HTTP/2について

HTTP/1.1に変わるSPDYに変わり、2015年から使用されています。
なぜ誕生したかというと、今は昔よりもリッチコンテンツが増え、1回のアクセスで大量にリクエストを送ることが普通になり、HTTP/1.1では限界を迎えたからです。

### HTTP/2の主な機能
#### ストリームの多重化
HTTP/1.1ではリクエストとレスポンスの組みを一つずつしか送受信できないことが問題だったが、hTTP/2では接続上にストリームという仮想的な双方向シーケンスを作ることで問題を解決しました。
#### ストリームの優先度
#### ヘッダー圧縮
#### フロー制御




## HTTPS
TLSで暗号化され、セキュリティを確保したHTTP




## HTTP cookie
HTTPは基本的にサーバがクライアントの状態を保持しないstatelessプロトコルですが、データベースなどを利用する際は状態保持が必要だったため、Cookieが導入された。
Cookieを使用することによって状態を管理し、‘セッション’を維持することができる。
メモリオーバークロックがnumpy計算速度に及ぼす影響

# テストコード

```python:test.py
for i in range(1,10):
    a,b = np.random.random(10**i),np.random.random(10**i)
    %timeit a+b
```
実行にかかった時間を見てどのくらい早くなるか比べる。

# PCスペック（メモリ以外）
- マザボ： ASRock z390 Taichi
- CPU: intel i9-9900k

# 比較するメモリ
- [Team Group 16GB (DDR4-2400)](https://www.amazon.co.jp/TEAM-DDR4-PC4-19200-DDR4-2400MHz%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-Eco%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8-16GBx2%E6%9E%9A%EF%BC%8832GBkit/dp/B01CCM3SAW)×2
    - こちらは定格動作で2400 MHz 出てる。
- [Kingston HyperX FURY RGB 16GB (DDR4-3200)](https://www.ark-pc.co.jp/i/11714523/)×2
    - XMP profile 1 (3200 MHz) だと相性が悪いのか（メモリOC初めてなので何かしくじっているのかも）起動しない…ので仕方なく profile 2 (3000 MHz) で運用。

# 実行結果

## 2400 MHz

292 ns ± 1.41 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)|
306 ns ± 1.72 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)|
553 ns ± 2.19 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)|
3.21 µs ± 12.7 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)|
34.3 µs ± 157 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)|
762 µs ± 2.09 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)|
23 ms ± 109 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)|
223 ms ± 1.56 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)|
2.19 s ± 5.48 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)|

## 3000 MHz

311 ns ± 0.858 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
328 ns ± 1.73 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
565 ns ± 3.43 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
3.49 µs ± 9.72 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
37.1 µs ± 74.3 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
672 µs ± 3.92 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
22 ms ± 286 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
209 ms ± 487 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)
2.1 s ± 4.34 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

# 結果？

微ッッッッッッ妙〜〜〜〜〜〜…………（しかも計算量少ないときはちょっと遅くなってるし……）

一応計算量が増えるに従って若干パフォーマンスはよくなってはいるが、単純に 2400/3000 = 0.8  で 20% 速くなるわけではないみたい
(2.1/2.19 = 0.96 で実際は 4% くらいしか変わってない)。

マザボの上限いっぱいの 4000 MHz まで上げれば何か変わるか…？？？

# 再実験

よくよく見るとXMPがちゃんと反映されてない（メモリ電圧が1.35 Vじゃなくて1.20V のままになっているので、なんかOCをしくじっている可能性も（大いに）ある。後々また検証しよう。
【Django入門】簡単なブログページを作る際の大まかな流れ　～プロジェクト編～

はじめに
===
[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしている<小栗>です。
「プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。

この記事は、[【Django入門】簡単なブログページを作る際の大まかな流れ　～環境構築編～](https://qiita.com/keitaro-o/items/158773ba5dc16dfa475c)
こちらの記事の続きです！

Djangoプロジェクトを作る！
===
前回の記事に続き、Djangoを使い簡単なブログページを作っていきます。

###仮想環境を立ちあげる

```terminal:DjangoBros
$DjangoBros>djangobros_venv\Scripts\activate
(djangobros_venv)$DjangoBros>
```

前回と同様ですね！

カレントディレクトリがDjangoBrosであることを確認して、プロジェクトを作成します。
ここではdjango_blogというプロジェクト名にしています。

```terminal:DjangoBros/
(djangobros_venv)$DjangoBros>django-admin startproject django_blog
```

dirコマンドを使い、DjangoBros内に先ほどのプロジェクトが存在することを確認します。
※Mac、Linuxの場合、コマンドはlsになります。

また、django_blog内のディレクトリ構成は、

```terminal:DjangoBros/django_blog/
django_blog
manage.py
```
になっているはず。
それぞれの中身については後々説明します。

###Djangoページを表示する

一つ下の階層に```manage.py```ファイルがあることを確認して、以下のようにコマンドを打ちます。

```DjangoBros/django_blog/
(djangobros_venv)$DjangoBros$django_blog>python manage.py runserver
```

※```python manage.py~```コマンドは一つ下の階層に```manage.py```ファイルが存在しないと使えません。

※ここで```http://127.0.0.1:8000/```にアクセスすると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425601/afc1c5b7-45e4-64bf-2dea-f08cc304b83c.png)

このようなページが表示されます。

#####※サーバーを停止する際

``` contorol+C ```でサーバーが静止します。

#####※サーバーを起動すると、ターミナルでコマンドが入力できなくなるため、別のウィンドウを開き、再度仮想環境に入る必要があります！


manage.pyで設定をする
===

####Ⅰ,setting.pyの設定をする


①言語の選択をする

```terminal:DjangoBros/django_blog/django_bllog/setting.py
LANGUAGE_CODE = 'ja-JP'
```
これで日本語で表示されます。

②タイムゾーンの設定をする

```terminal:DjangoBros/django_blog/django_bllog/setting.py
TIME_ZONE = 'Asia/Tokyo'
```
これで、日本の時刻が基準として設定されます。

####migrateして、サーバーを構築する

Djangoではデフォルトでsqlite3というデータベースが指定されていますが、実際にデータベースを構築する必要があります。
その際のコマンドは、```python manage.py migrate```です。
django_blogディレクトリでコマンドを入力します。

```terminal:/DjangoBros/django_blog/
$python manage.py migrate

```

```python manage.py migrate```はデータベースの設計変更をデータベースに反映するコマンドです。
Githubに繋ごうとすると\337\376hでエラーが出る

# 環境
windows10
git 2.21.0.windows.1

# ssh接続できていない
SSHの鍵の設定をしてからリポジトリを作成し、初めてのpushをしようとすると

```
$ ssh push origin master
/c/Users/hoge/.ssh/config: line 1: Bad configuration option: \377\376h
/c/Users/hoge/.ssh/config: terminating, 1 bad configuration options
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```

と出る。
ssh接続できていないといわれたので確認してみる。

```
$ ssh -T git@github.com
/c/Users/hoge/.ssh/config: line 1: Bad configuration option: \377\376h
/c/Users/hoge/.ssh/config: terminating, 1 bad configuration options
```

同様のエラーが出るのでやはり繋がっていないらしい。
configファイルの設定がおかしいらしいが、ファイル中に\377\376hという記述はみつからない。

# IgnoreUnknownを指定してみる

```
$ vi ~/.ssh/config
```

でvimを開いてファイル中に

```
IgnoreUnknown \377\376h
```

を先頭に記述。


```
$ ssh -T git@github.com
/c/Users/hoge/.ssh/config: line 1: Bad configuration option: \377\376i
/c/Users/hoge/.ssh/config: terminating, 1 bad configuration options
```

なぜか\377\376iに名前を変えてきた。


# ググった
powershellからconfigファイルを作成するとUTF-16 LEでエンコードされたファイルが作成される。これがいけないらしい。（cmdやgit bash、エディタからだと回避できる模様）
実際VSCodeで開いてみたらUTF-16 LEになっていた。
これをUTF-8にして保存する。

```
$ ssh -T git@github.com
The authenticity of host 'hoge' can't be established.
RSA key fingerprint is SHA256:hogehoge
Are you sure you want to continue connecting (yes/no)? 
```

yesを入力してパスワードも入力

```
Hi hoge! You've successfully authenticated, but GitHub does not provide shell access.
```

で　き　た

無事pushもできました


# 参考
https://github.com/hashicorp/vagrant/issues/10386
Reactのアーキテクトを考える道のり - その4(Atomic Designを知る)

## コンポーネントのディレクトリ構成がカオスになる
なんとか、[非同期処理](https://qiita.com/motuo/items/f82d8eb0560b64b0dea4)までかける様になった私は、少しずつコンポーネントの開発を進めていくことが出来る様になりました。

この時、私は

大きな機能を持ったページを作る
↓
プログラムの見通しが悪くなってきたと、感じたら分割できそうなところを切り出す

という順番で機能を作って行きました。
そうすると、ディレクトリ構成がオレオレ化して、自分自身でもわけのわからない状態になってしまいました。

この時のディレクトリ構成
<img width="229" alt="スクリーンショット 2019-09-06 18.08.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154110/dd540c81-b2fa-e775-5905-2bfacdb1f6ce.png">

我ながら、**subディレクトリってなんだよ。。。**という状態になりました。これでは複数人で開発することなど夢のまた夢、となりそうです。

## というわけでコンポーネントの分割方法を調べてみた
React専用というわけではありませんが、[Atomic Design](http://atomicdesign.bradfrost.com/)という設計方法が、どうやら多くのプロジェクトで採用されている様です。
個人的には上記のサイトに記述されている[Atomic design is for user interfaces](http://atomicdesign.bradfrost.com/chapter-2/#atomic-design-is-for-user-interfaces)という項目が非常にわかりやすかったです。
<img width="1134" alt="スクリーンショット 2019-09-06 18.13.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154110/c829e064-003e-8164-764a-3d9af7dd6960.png">

どの単位でコンポーネントを分割するべきか、指標ができたために可能な限り、それに従って開発することを心がけています。
具体的には、ATOMS→MOLECULES→ORGANISMS→TEMPLATES→PAGESの順番を意識しながらコンポーネントを作っています。
作成するオブジェクトの数はかなり増えてしまいますが、Storybookを使えば、コンポーネント単位で動作を確認できる様になるためにメリットは大きいと感じています。
<img width="654" alt="スクリーンショット 2019-09-06 18.18.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154110/ec0fd90c-3e8a-701d-49e7-0ea236030282.png">

## Reduxとはどこでconnectする？
Atomic Designに厳密に従うならば、データを取得する`Pages`で`connect`すべきなのかもしれませんが、現状は`Organisms`でconnectをしています。
理由としては、`Pages`でコネクトしてしまうと下層のコンポーネントで使っているプロパティを把握せねばならなくなり、結果として`Pages`が知る情報が過剰になってしまうと感じたためです。
というわけで、私のプロジェクトでは下記の考え方で運用しています。

* `Pages`→React Routerで指定する遷移先
* `Organisms`→Reduxとconnectするコンポーネント

## 参考にしたサイト
色々なサイトを見ると、やはり皆さん運用には苦労している様で。。。今の所、これといった正解は無いようです。

1. [Atomic Designを分かったつもりになる](https://design.dena.com/design/atomic-design-%E3%82%92%E5%88%86%E3%81%8B%E3%81%A3%E3%81%9F%E3%81%A4%E3%82%82%E3%82%8A%E3%81%AB%E3%81%AA%E3%82%8B/)
2. [React Component 視点でのアトミックデザインの解釈といくつかの疑問](https://mizchi.hatenablog.com/entry/2018/06/07/203739)
【Django入門】簡単なブログページを作る際の大まかな流れ　～環境構築編～

はじめに
===
[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしている<小栗>です。
「プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。


Djangobrothers
===
Djangoを学習するに当たり、参考にしているサイトです。
わかりやすいチュートリアルを通して、Djangoの基礎を学ぶことができます。
しかし、MacOsで進められているので、適宜自分で調べる必要がありますが、特に問題はありません。
この記事は、Djangobrothersのブログ管理サイトを作る際の手順をまとめた物なので、以下のサイトで取り組みながら見ていただけるとわかりやすいかと思います。
[Djangobrothers/ブログ管理サイトチュートリアル](https://djangobrothers.com/tutorials/blog_app/)


Djangoを用いて、ブログ管理サイトを作る
===

###仮想環境を作る

まずは今回のチュートリアル用に任意のディレクトリを作ります。

```console
$mkdir DjangoBros #DjangoBrosというディレクトリを作成
$cd DjangoBros #カレントディレクトリをDjangoBrosにした。
```



そして、このディレクトリ内に仮想環境を作る。
コマンドは、

```console:DjangoBros
python3 -m venv djangobros_venv
```
ただし、「python3は内部コマンド、外部コマンド、操作可能なプログラムまたは、、、」といったエラーが表示された場合、以下のコマンドでも可能。

```console:DjangoBros
python -m venv djangobros_venv
```

このコマンドの意味は、pythonを用いて、djangobros_venvという仮想環境を構築するという意味である。
そのため、djangobros_venvの部分は任意の仮想環境の名前で良い。
venvはVirtual Environment(仮想環境)の略。

###仮想環境内にDjangoをインストールする
DjangoBrothersではWindows用のコマンドではないので、こちらで調べて仮想環境に入るコマンドを打ちこみました。

####仮想環境に入る

```console:DjangoBros
$DjangoBros>djangobros_venv\Scripts\activate
```

仮想環境に入る事に成功すると、コマンドラインの左側に（djangobros_venv）と表示されます。

####pipをインストールする
Djangoを管理するためにpythonのパッケージ管理システムであるpipをインストールします。

まずはpipを最新の物にアップグレードします。

```terminal:DjangoBros/
(djangobros_venv)$DjangoBros>pip install --upgrade pip
```

次にpipを用いて、Djangoをインストールします。

```terminal:DjangoBros/
(djangobros_venv)$pip install django

```

ちゃんとインストールできているか確認します。

```terminal:DjangoBros
(djangobros_venv)$python
>>>import django
>>>django.get_version()
#ここにインストールしたDjangoのバージョンが表示されれば成功です。
>>>quit() #コマンドプロンプトを終了します。
```

####仮想環境から抜ける際のコマンド

```terminal
(djangobros_venv)$DjangoBros>deactivate

```

続きはこちらで！
[【Django入門】簡単なブログページを作る際の大まかな流れ　～プロジェクト編～](https://qiita.com/keitaro-o/items/50a78c52eeffcbab5b06)
ABC128

#A - Apple Pie
```c++
#include<bits/stdc++.h>
using namespace std;

int main(){
    int A,P; cin >> A >> P;
    int sum=0,ans=0;
    sum=A*3+P;
    ans=sum/2;
    
    cout << ans;
    
}
```

#B - Guidebook(もう一回)
```c++
#include <bits/stdc++.h>
using namespace std;

int main(){
    int N; cin >> N;
    vector <tuple<string,int,int>> A(N);
    
    for (int i=0; i<N; i++){
        string S; cin >> S;
        int t; cin >> t;
        A[i]=make_tuple(S,100-t,i+1);//make_tupleではなく、{}とするとCEになる
    }
    
    sort(A.begin(),A.end()); //A[i].first,second...を全て昇順に並べる
    for (int i=0; i<N; i++) cout << get<2>(A[i]) << endl; //tupleの中身は"get<?>(??)"で抽出できる！
    
    return 0;  
}
```
##改善点(辞書型はtupleで解決)
**① vector < tuple < string, int, int > > A(N);
②A[i]=make_tuple(S,100-t,i+1);
③sort(A.begin(),A.end());
④get<2>(A[i])**
の4つを書けるようにする！

#C - Switches(ビット全探索)
今日中にあげる
xmlrpc.client.Fault: <Fault -32700: 'parse error. not well formed'>

# PythonでWordpressに書き込めない

python-wordpress-xmlrpcというライブラリで、Wordpressに投稿しようとしていた。
ローカルに書き込めるのでいけるだろうとサーバに向けて実行した。
エラーが発生したのを解決した一部始終を書いておく。

```
xmlrpc.client.Fault: <Fault -32700: 'parse error. not well formed'>
```

## コード

```
# -*- coding:utf-8 -*-
from wordpress_xmlrpc import Client, WordPressPost
from wordpress_xmlrpc.methods.posts import GetPosts, NewPost
from datetime import datetime


def post_wordpress(publish):
    wp = Client('http://xxxx/xmlrpc.php', 'api_user', 'xxxxxx')

    post = WordPressPost()

    post.title = "スペシャルサマーライブ23"
    post.content = "ドキドキコンサート"

    post.terms_names = {
        'post_tag': [],
        'category': []
    }
    custom_fields = list()
    custom_fields.append({'key': 'event_name', 'value': 'イベント名'})
    custom_fields.append({'key': 'event_date', 'value': '2019-09-30 11:11:00'})
    post.custom_fields = custom_fields

    if publish:
        post.post_status = 'publish'
    post.date = datetime.now()

    wp.call(NewPost(post))


if __name__ == '__main__':
    post_wordpress(False)
```

## 発生箇所
Clientを作成する部分でエラーが発生する。

## 対処内容
アクセスするサーバで以下を実行する。

```
sudo yum install php-xml
sudo systemctl restart php-fpm.service
sudo systemctl restart httpd.service
```
🚀 プロンプトを超絶おしゃれにする Starship を紹介

GitHub trending に良さそうなプロダクトがあったため紹介をしたいと思います。

![](https://raw.githubusercontent.com/starship/starship/master/media/demo.gif)

## [Starship](https://starship.rs)

公式: https://starship.rs
GitHub: https://github.com/starship/starship

Starship はプロンプト(ターミナルに表示されるカレントディレクトリやユーザーの情報)
のカスタマイズを行うプラグインのようなもので、特徴としては

`公式より引用`

> Starship is the minimal, blazing fast, and extremely customizable prompt for any shell!
> The prompt shows information you need while you're working, while staying sleek and out of the way.

Rustで作られているために高速に動くそうです。

### インストール
Macであればとても簡単に、

```sh
brew install starship
```

Bashを利用していれば、 `~/.bashrc` に

```bash:.bashrc
eval "$(starship init bash)"
```

でインストール可能です。 `.bashrc` を魔改造したりする必要がないため、なんと言ってもインストールが楽。
また、各シェルに対応しているため、 `fish` でも `zsh` でも利用することが可能です。

### カスタマイズ

各表示項目はカスタマイズ可能で

```sh
$ touch ~/.config/starship.toml
```

```toml:~/.config/starship.toml
add_newline = false
```

のように、TOMLファイルで設定ができるようです。自分は1行空いてしまうのが嫌だったので👆の `add_newline` を `false` にしておきました。

各項目については https://starship.rs/config/ に詳しく書いてあります。

## 追記
そこそこいいねが伸びたので、軽く Author に報告してみると、

<blockquote class="twitter-tweet" data-conversation="none" data-cards="hidden" data-partner="tweetdeck"><p lang="en" dir="ltr">Seeing how much interest there is by Japanese developers, we&#39;ve started accepting Japanese translations for the website and docs! 😄<a href="https://t.co/qB5yTp4Lt3">https://t.co/qB5yTp4Lt3</a></p>&mdash; Matan Kushner (@matchai) <a href="https://twitter.com/matchai/status/1171181489297321984?ref_src=twsrc%5Etfw">September 9, 2019</a></blockquote>

![](https://user-images.githubusercontent.com/4658208/64568188-2423f680-d328-11e9-8099-cb1c6fdc328d.png)

とのことで、日本からの流入が多くあり、日本語の翻訳をサポートするとのことでした。

https://github.com/starship/starship/issues/331

👆の Issue から翻訳の協力ができるようなので、もし便利にプロダクトを使っていて協力したいと思う方はぜひよろしくおねがいします :pray:
pyinstallerによる実行ファイルの作成

作成したスクリプトをpyinstallerを使用して実行ファイルにする際に幾つか詰まったところがあったので、記録として残します。

環境は以下のような感じです。
Python-3.7.4
pyinstaller-3.5
PyQt5-5.13.0

######pyqtgraphのimport順番

>Exception: PyQtGraph requires one of PyQt4, PyQt5 or PySide; none of these packages could be imported.
[5708] Failed to execute script console

というエラーが出ていましたが、原因はimport文を書く順番でした。
スクリプトから実行する場合はある程度順番が逆でも問題ないのですが、pyinstallerで実行ファイルにした際には厳密に処理されるようです。
PyQt5を先にimportして、その後、PyQtGraphのimportをするようにしました。

######Qt5Core.dllなどを読み込まない
実行ファイルと同じディレクトリにQt5Core.dllなどを置いても読み込みませんでした。
環境変数でPATHを設定しておけば実行ファイルが起動できるようになることから、PATHが通っていないことがわかりました。

この為、以下のコードを**PyQt5のimport文の前に**挿入しました。

```
# Fix qt import error
# Include this file before import PyQt5 

import os
import sys
import logging


def _append_run_path():
    if getattr(sys, 'frozen', False):
        pathlist = []

        # If the application is run as a bundle, the pyInstaller bootloader
        # extends the sys module by a flag frozen=True and sets the app
        # path into variable _MEIPASS'.
        pathlist.append(sys._MEIPASS)

        # the application exe path
        _main_app_path = os.path.dirname(sys.executable)
        pathlist.append(_main_app_path)

        # append to system path enviroment
        os.environ["PATH"] += os.pathsep + os.pathsep.join(pathlist)

    logging.error("current PATH: %s", os.environ['PATH'])


_append_run_path()
```

参考にした記事
[How to fix “ImportError: unable to find Qt5Core.dll on PATH” after pyinstaller bundled the python application - Stack Overflow](https://stackoverflow.com/questions/56949297/how-to-fix-importerror-unable-to-find-qt5core-dll-on-path-after-pyinstaller-b?rq=1)

######specファイルなどで指定したファイルの読み込み
specファイルのdatasに指定したファイルは実行時にsys._MEIPASSで取得できるディレクトリに展開されるようです。
以下のように設定することで取得が出来ました。

```
if hasattr(sys, "_MEIPASS"):
    FILE_PATH = os.path.join(sys._MEIPASS, 'test.png')
else:
    FILE_PATH = os.path.join(os.path.dirname(__file__), 'test.png')
```
ps1ファイルで引数を使う

## `param`で受け取る
```argstest.ps1
param(
    $Args1,
    $Args2
)

Write-Host -Object $Args1
Write-Host -Object $Args2
```

## 実行
オプションパラメータもtab補完で出る

```Powershell
PS W:\> .\argstest.ps1 -Args1 aaa -Args2 bbb
aaa
bbb
PS W:\>
```
Ruby のバージョンアップで気をつけるべきこと

# はじめに
Ruby `2.4.0`を `2.6.2` にアップデートする際につまったことをまとめました。

# 心構え  
Ruby バージョンアップに伴う影響範囲は膨大であることを肝に銘じましょう。
BundleやGemなどの便利なものがありますが、依存性などの関係で動かなくなることがあります。
すんなり移行できることのほうが珍しいです。

# Ruby
## バージョン定義ファイル
調査のため頻繁に切り替えるので、すべてが同じ値か、想定している値か確認しましょう。

| ファイル名 | 説明 |
| --- | --- |
| Gemfile | Gemの定義ファイル |
| Gemfile.lock | Gemfileから生成する |
| .ruby-version | Rubyバージョン定義 |

## アップデート順序
Rubyのマイナーバージョンを一気に更新することはよろしくないとの有識者からの助言があったので、 `2.4.0` → `2.5.0` → `2.6.2` という段階を踏んでアップデートしました。
実例として、`2.4.0` → `2.5.0` への更新は成功するが、`2.5.0` → `2.6.2` でエラーになるケースがありました。
問題切り分けのためこちらも試して見ましょう。

# bundle 関連
## updateは慎重に  
`bundle update`は、既存の `Gemfile.lock`を破棄し`Gemfile`から`Gemfile.lock`を生成します。 
ここで問題となるケースが、`Gemfile`にバージョン指定がない場合です。
その場合、最新リポジトリを取得しますが、依存性の関係で動かなくなることがあります。 
bundle コマンドの影響の小さいものから試してみましょう。

## bundle オプション
上は影響度が低く、下ほど影響度が高いです。

| コマンド名 | 説明 |
| --- | --- |
| bundle install | Gemfileにはあるが、Gemfile.lockに記載のないものをインストールします  |
| bundle update {gem名} | 指定したGemのみを更新します  |
| bundle update   | GemfileからGemfile.lockを生成します。 現行のGemfile.lockは破棄します。 |

## rbenv: bundle: command not found 
Rubyのバージョンを変更すると、`bundle`が見つからなくなることがあります。

```
# エラーコード
$ bundle update
rbenv: bundle: command not found

The `bundle' command exists in these Ruby versions:
  2.6.2
```

こういった場合は、`bundle`手動インストールしましょう。

```
gem install bundler
```

# エラーの調査方法
## 正常に動作している環境を確保する
まず正常動作する環境を確保しましょう。
これができると「実行環境の問題」か、「コードの問題」か切り分けが出来るようになります。
別環境で正常動作しているものを見つけ、自分の環境で動作させてみましょう。
`新規Railsアプリケーションを構築` でもいいと思います。

## 依存性を確認しよう
Gemの動作要件として、別のGemが指定されていることがよくあります。
Gemの最新バージョンを取得すると、現行バージョンと比較して次のようなケースがあります。

- 要求するGemのバージョン指定が上がった
- 要求するGemが、不要になった
- 要求するGemが、差し替えられた

ややこしいのですが、`rubygems.org` のサイトで検索を行い、`runtime 依存性` を確認してみましょう。
https://rubygems.org/
別環境で動いているコードがあるのでしたら、当該部分の`Gemfile.lock`の記述をあわせてみて動作確認してみましょう。

## Gem公式ページの確認
Gemで提供しているライブラリは、Githubで管理されていることが多いと思います。
公式ページを確認し、不具合issueがないか確認しましょう。修正中や本番リリース待ちだったりします。
急いでいる場合は、`Gemfile.lock`を編集して動作確認できたバージョンまでダウングレードることで対応しましょう。
MacアドレスからSSH接続

#読むと下記が手にはいる
- RaspberryPiやJetson Nanoで超簡単にSSH接続する方法
- 毎回IPアドレスを調べずともSSH接続できる（IPの固定化不要）

#方法
同じネットワークに接続されている別端末から下記コマンドでログインパスいれるだけ。

```
arp -an | grep "your-mac-address" | tr -d "()" | awk '{print $2}' | xargs sh -c 'ssh yourusername@"$@" </dev/tty' ssh
```

IPアドレスだけ知りたい場合は下記。

```
arp -an | grep "your-mac-address" | tr -d "()" | awk '{print $2}'
```

Macアドレスを知りたい場合は下記。

```
ifconfig | grep "ether" | awk '{print $2}' | awk 'END{print}'
```
Laravelで最悪クビが飛ぶコードの書き方

ここはtoCなWebサービスを展開するIT企業。物語はここから始まる

:older_man_tone1:先輩「後輩くん、検証環境だけで動かしたいライブラリがあるんやけど入れてくれる？」

:baby_tone1:後輩「わかりました。」

・・・数分後

:baby_tone1:後輩「こんなコードでええやろ。これなら検証環境でのみライブラリが有効化されるハズや」

```php
if (env('APP_ENV') != 'production') {
  // 検証環境でのみ動作させたいコード
}
```

:baby_tone1:後輩「よし。検証環境でちゃんと動いとるな。本番にもデプロイや、ぽちー」

・・・数分後

:older_man_tone1:先輩「大変や後輩君！本番環境で表示されてはいけない情報が表示されてしまってるわ！セキュリティインシデントや！」

どうしてこうなってしまったのでしょうか、原因を見ていきましょう。

# :skull:何が起こったのか？

後輩くんが追加したのは以下のコードです。

```php
if (env('APP_ENV') != 'production') {
  // 検証環境でのみ動作させたいコード
}
```

if文で検証環境かどうかを調べて、検証環境の場合のみライブラリを有効化する様なコードを書いたにも関わらず
本番環境でもライブラリが有効化されてしまいました。

# :thinking: どうしてこうなるのか？

`env()`には以下の仕様があります。

> `php artisan cache:config`を実行すると`env()`は`null`を返すようになります。

by [公式ドキュメント](https://laravel.com/docs/5.8/helpers#method-env)

今回のケースでは、本番環境ではコンフィグをキャッシュする運用になっており、デプロイすると自動的に`php artisan cache:config`が実行される様になっていました。

その結果、以下のコードは本番環境でも`true`になってしまい、意図せず、検証環境用のコードが本番環境で実行されてしまいました。

```php
env('APP_ENV') != 'production'
```

もし、Debugbarを有効化する様なコードがここにかかれていた場合、本番環境でDebugbarが有効化されてしまいます。
するとDBアクセス情報などが利用者の画面に表示されてしまうので簡単に情報漏洩が発生します。

# :bulb: じゃあどうすればいいの？

`config('app.env')`を使いましょう。
書き直すと以下の様になります。

```php
if (config('app.env') != 'production') {
  // 検証環境でのみ動作させたいコード
}
```

上記であれば`php artisan cache:config`をしても問題なく動作します。

（そもそも環境で分岐する様なコードを避けるというのも大正解だと思います）

ちなみに[公式ドキュメント](
<https://laravel.com/docs/6.0/configuration#determining-the-current-environment>)では`App::environment()`の使用を推奨している様です。
こちらも内部的にはconfigの'app.env'を参照しています。

```php
$app->detectEnvironment(function () use ($config) {
    return $config->get('app.env', 'production');
});
```


以上です。
「コンフィグをキャッシュするとenv()がnullを返すようになる」仕様を知らなくてハマった人いっぱいいそうだなぁと思って書きました。
誰かが救われると幸いです。
(Firebaseの)Cloud Functionsで外部API呼び出しが時々失敗する場合はPromiseを返しているか疑え

# どんな問題？

Firebaseで、特定のFirestore Collection に Documentが追加されたら
複数のユーザにSendGrid経由でメールを送る処理を書いていた。

雑にコードを示すとこんな感じ

```javascript

const functions = require('firebase-functions');

exports.sendEmailViaSendGrid = functions.region(functions.config().region.name).firestore.document("foo/{fooId}").onCreate(snapshot => {

    //メール送信対象のメアド一覧を取得
    const mailAddresses = []; 

    //各メールアドレスに対して、SendGrid API叩いてメール送る
    mailAddresses.forEach(mailAddress => {
        // 各メールアドレスに対して、SendGrid API叩く処理
    });
});
```

ところが、これをデプロイしたところ、
メールが送られたり送られなかったりする現象が発生した。
（全件送信されるときもあれば、数件送信できてないときもあれば、全く送信できない場合もあった）

# 解決方法

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">非同期処理のHTTP通信が終わる前に実行環境がシャットダウンしているとかそういう話なのでは？ 非同期のバグによくある、特定の処理が間に合う場合と間に合わない場合があるという症状な感じがします。チュートリアルのようにPromiseを返してもそんな現象になるんですか？ <a href="https://t.co/gY82NyBYpo">https://t.co/gY82NyBYpo</a></p>&mdash; n (@n_1215) <a href="https://twitter.com/n_1215/status/1169777504107692033?ref_src=twsrc%5Etfw">September 6, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

まさにこれでした。

以下のように修正。（これも実際のコードではなく、雑に概念だけ書いたもの）

```javascript

const functions = require('firebase-functions');

exports.sendEmailViaSendGrid = functions.region(functions.config().region.name).firestore.document("foo/{fooId}").onCreate(snapshot => {

    //メール送信対象のメアド一覧を取得
    const mailAddresses = []; 

    //各メールアドレスに対して、SendGrid API叩いてメール送る
    return Promise.all(mailAddresses.map(mailAddress => {
        // 各メールアドレスに対して、SendGrid API叩く処理(Promiseを返す)
    }));
});
```

ちゃんと全件にメールが飛ぶようになりました。
Zen of freelance

- ストイックに学べそして磨け
- 安売りするな、人生の貴重な時間を売ってるんだ
- 納期を守れ
- 請求書をきちんと送れ
- 無茶振りは断れ安売りするな
- 文句を言うなPR出せ
- エージェントマージンを最低限に交渉しろ
- 信用を勝ち取れ、単価を上げろ
- 正社員は安定、その考え方が不安定だ
- 未来を選べ、人生を選べ
Swift：UIColorの色指定に独自色を追加する

`UIColor`には`UIColor.red`やら`UIColor.darkGray`などの便利な色指定がデフォルトで存在しますが，独自の色を追加する方法をまとめておきます．

# Color Assetとして色を追加する(非必須）
`Asset Catalog`で色を管理できます．最近はダークモードへの対応などもあると思うので，ぜひ使いましょう．
<img width="933" alt="color.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67153/41228bb8-1018-0579-6715-3160acc497ef.png">
↑こんな感じ

# UIColorのExtensionを記述する

```swift
extension UIColor {
    static let 色名 = UIColor() //お好きな初期化
    // 例
    static let danger = UIColor(named: "dangerColor")! //Asset Catalogに登録した名前
}
```

これだけでどこからでも`UIColor.danger`などで色を使うことができるようになります．（`Asset Catalog`を使うと微妙な色の調整もまとめて管理できますね）

#備考
`NSColor`で`Color Asset`を使う場合は，`NSColor(named: NSColor.Name(""))!`という風に`NSColor.Name`を噛ませる必要があります．
【JavaScript，CSS】ボタンの波紋を実装する

## まずはじめに
シンプルさを重視。ボタンをクリックしたときに、波紋が発生するデザインを考えてみました。いろいろな海外のサイトを研究した上で、自分なりに作った比較的わかりやすい実装方法を紹介します。
一般に **Ripple Effect** と呼ばれ、Google の Material Design にも採用されています。

<p class="codepen" data-height="300" data-theme-id="0" data-default-tab="css,result" data-user="masa_mf3rs" data-slug-hash="QWLaapR" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="QWLaapR">
  <span>See the Pen <a href="https://codepen.io/masa_mf3rs/pen/QWLaapR/">
  QWLaapR</a> by MF3PGM (<a href="https://codepen.io/masa_mf3rs">@masa_mf3rs</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

## この記事の対象者
JavaScriptの基礎を学習したい人。デザインが好きな人などなど。
## 1. HTML
今回はbuttonタグを使用します。

```HTML:HTML
<button id= "btn" >CLICK ME</button>
```
## 2. CSS
まず、`#btn`でボタンを、`.ripple`で波紋のデザインを指定します。また、波紋のアニメーションもここで作成します。

```CSS:CSS
#btn{
    /*ボタンのデフォルトのデザインをリセット*/
    border: none;
    outline: none;
    /*position: relative; は必須*/
    position: relative;
    height: 47px;
    width: 150px;
    border-radius: 3px;
    display: block;
    margin: 100px auto;
    color: white;
    background-color: #448AFF;
    box-shadow: 0.9px 1.0px 2px rgba(0,0,0,0.2);
    font-size: 14px;
    letter-spacing: 0.03em;
    /*波紋のはみ出しを消す*/
    overflow: hidden;
}

.ripple {
    /*position: absolute; は必須*/
    position: absolute;
    background-color: white;
    width: 20px;
    height: 20px;
    border-radius: 50%;
    /*今回はアニメーションの名前，変化の時間，繰り返し回数*/
    animation: rippleEffect 1200ms 1;
    opacity: 0;
}
@keyframes rippleEffect {
    from {
        transform: scale(1);
        opacity: 0.45;
    }
    to {
        transform: scale(50);
        opacity: 0;
    }
}
```
## 3. JavaScript
参考資料よりもシンプルにしました。
まず、クリックした位置を計算し、波紋の位置を決めます。それができたら、ボタンがクリックされるたびに波紋であるdivを生成します

**☞ 波紋の位置について**（難しいのはここだけ）
- `.page`　**ページ全体の左上からのイベント発生場所（今回はボタン自体）の水平位置を返す**
- `.offset`　**要素の左上からの水平位置を返す**

- `element.setAttribute(name, value);`　**既にある要素に新しい属性を追加、または変更する**

```JavaScript:JavaScript
// #btnを取得
const rippleElement = document.getElementById("btn");
rippleElement.onclick = function(e) {
    // 今回のthisはボタンを意味する
    // X，Y、つまりボタンの左上の角からの距離を求める
    //（ボタンの中にdivを生成させるため）
    const X = e.pageX - this.offsetLeft;
    const Y = e.pageY - this.offsetTop;
    // divを生成する
    let rippleDiv = document.createElement("div");
    // divのデザイン
    rippleDiv.classList.add('ripple');
    // divの位置を.setAttributeで指定
    rippleDiv.setAttribute("style","top:"+Y+"px; left:"+X+"px;");
    // divをボタンに入れる
    rippleElement.appendChild(rippleDiv);
    //divを削除する(このコードは任意です)
    setTimeout(function() {
        rippleDiv.remove();
    },1200);
}
```

## おわりに
初めてQitaに記事を投稿してみました。僕自身JavaScriptを学習し始めて3か月くらいしか経っていませんが、この記事が皆様にお役に立てれば幸いです。
## 参考サイト
[Material Design Ripple Effect In Pure JavaScript](https://www.cssscript.com/material-design-ripple-effect-pure-javascript/)
ファイル名/ディレクトリ名に入っている特殊文字を置き換えするワンライナー

```bash:半角丸カッコを全角丸カッコに置換するワンライナー
i=1; while [ $i -ne 0 ]; do find /hogehoge -type f -regex ".*(.*" -exec rename '(' '（' '{}' \;; i=`find /hogehoge -type f -regex ".*(.*" | wc -l`; done
```

全然ワンライナーじゃないけど…とりあえずメモ。
findしたファイル名をrenameコマンドに食わせていますが、renameコマンドが
1文字置換したら抜けてしまう仕様のようなので、ループさせて特殊文字が
なくなるまで処理させています。
ディレクトリに特殊文字が含まれていると、エラーになってしまうので先にディレクトリに対して
同様の処理をしておくのをオススメします。
ディレクトリに実行する場合は、-type に d を指定します。

なお、角カッコの場合は

```bash:半角角カッコを全角角カッコに置換するワンライナー
i=1; while [ $i -ne 0 ]; do find /hogehoge -type f -regex ".*\[.*" -exec rename '[' '［' '{}' \;; i=`find /hogehoge -type f -regex ".*\[.*" | wc -l`; done
```
findのregexに指定した角カッコの前にエスケープ文字を入れてあげる必要があります。

いつかまた使うかもしれないので、メモ。
Make the hard drive available in Ubuntu

Check drives

Command: "sudo fdisk -l"
Output:Disk /dev/sdb: 107.4 GB, 107374182400 bytes255 heads, 63 sectors/track, 13054 cylinders, total 209715200 sectorsUnits = sectors of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytesDisk identifier: 0x00000000Disk /dev/sdb doesn't contain a valid partition table

Create partition

Command: "sudo fdisk /dev/sdb"

type 'n' to create partition
Next select partition type p=Primary, e=Extended

Specify number of partitions
I had to create two partitions. For me next two options were to specify first sector and last sector where I selected default.

'w' to write the changes

'q' to quite fdisk

Update kernel with changes
Command: "sudo partprobe /dev/sdb"

Format hard drive
Command: "sudo mkfs /dev/sdb2 -t ext4"

Create a directory for mount point. Following convention to create under /mnt
Command: "sudo mkdir /mnt/sdb2"

Make the folder writable
Command: "sudo chmod 777 /mnt/sdb2"

Mount drive to folder

Command: "sudo mount /dev/sdb2 /mnt/sdb2 -t ext4"

https://qiita.com/ryokato_me/items/3b2298f9016a8a002ecd
ドメインユーザーに対して「次回ログオン時にパスワード変更」を設定

## Powershellで実行
外すときは`$false`で

```powershell
Set-ADUser -Identity user1 -ChangePasswordAtLogon $true
```

## ActiveDirectoryユーザーとコンピューター
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/e23d3522-dd97-0f5f-fa8a-a92899fc2421.png)
Deluge チートシート

Deluge をあまり知らないので、予約語や組み込み関数/メソッドの一覧を備忘録として残しておく。網羅できているかどうかはわからない。本当は `zoho.sheet.*` のようなアプリケーションの機能の方に面白いものがあるのだろうが、Deluge の話題は Zoho CRM ばかりで、Zoho Workplace を使っている身としてはソレナンノコトだ。

条件分岐
========

if 文
-----

    if(<expr>)
    {
    ...
    }
    else if(<expr>)
    {
    ...
    }
    else
    {
    ...
    }

スクリプトエディターの自動整形機能がいまひとつで、冗長になる。

IF 関数
-------

    IF(<expr-if>, <expr-then>, <expr-else>)

短絡評価をするかどうかで使い勝手も変わるのだが、どっちなのかは調べていない。

IFNULL 関数
-----------

    IFNULL(<expr>, <expr-ifnull>)

繰り返し
========

    for each <var> in <list>

    for each index <var> in <list>

これしかない。アプリケーションがスタックすると困るからだろう。

メール送信
==========

    sendmail
    [
    From : <expr>
    To : <expr>
    Subject : <expr>
    Message : <expr>
    ]

メール送信はすごく楽だ。添付ができるかどうかは調べていない。

警告表示
========

    alert <expr>;

情報表示
========

    info <expr>;

リスト
======

    { ..., ..., ... }

    List()

    List:String() holds a list of string data.

    List:Int() holds a list of int data.

    List:Date(), List:Bool() and List:Float() are the same.

    list.add(data)

    list.remove(n)

    list.removeElement(data)

    list.addAll(list2)

    list.removeAll(list2)

    list.clear()

    list.sort(<bool>)

辞書
====

    { "..." : "...", "..." : "...", ... }

    <var> = map()

    map.put(<key>, <value>)

    map.put(<sourcemap>)

    map.remove(<key>)

    map.clear()

外部アクセス
============

    getUrl(<urlstr>)

    postUrl(<urlstr>, <map-variable>, true)

組込定数
========

    zoho.currentdate

    zoho.currenttime

    zoho.loginuser

    zoho.loginuserid

    zoho.adminuser

    zoho.adminuserid

    zoho.appname

    zoho.ipaddress

    zoho.appuri

検索
====

    <expr> in <list>

    <expr> not in <list>

組み込み関数
============

    <str>.contains(<str>)

    <str>.endsWith(<str>)

    <str>.startswith(<str>)

    <str>.remove(<str>)

    <str>.removeFirstOccurance(<str>)

    <str>.removeLastOccurence(<str>)

    <str>.getSuffix(<str>)

    <str>.getPrefix(<str>)

    <str>.toUpperCase()

    <str>.toLowerCase()

    <str>.getAlphaNumeric()

    <str>.getAlpha()

    <str>.removeAllAlphaNumeric()

    <str>.removeAllAlpha()

    <str>.length()

    <str>.getOccurenceCount(<expr>)

    <str>.indexOf(<expr>)

    <str>.lastIndexOf(<expr>)

    <str>.substring(<expr-start>, <expr-end>)

    <str>.trim()

    <str>.equalsIgnoreCase(<expr>)

    <expr>.toString()

    <str>.matches(<regexp>)

    <str>.replaceAll(<expr-search>, <expr-replace>, <bool>)

    <str>.replaceFirst(<expr-search>, <expr-replace>, <bool>)

    leftpad(<str>, <int>)

    rightpad(<str>, <int>)

`leftpad()`, `rightpad()` がスペースでのパディングしかできず直接ゼロパディングできないところが惜しい。また `replaceAll()` の `<expr-search>` が文字列しか取れないのも地味に残念だ。正規表現は `matches()` でのみ使える。そして正規表現の仕様は "The regular expression." としか書かれていないのが清々しい。