OmniAICreator/Qiita-1.07M huggingface dataset:
vb.net メモリ使用量解析

開発中のvb.netアプリにてメモリ使用量のログが必要になったので、覚書

## やりたいこと
- 開発アプリのメモリ使用量をロギングしたい

## 環境
- 言語：　vb.net
- .Net Framework：　4.5

## 実装
```vb.net
  Public Sub SaveMemoryLog()
    Try
      Dim MsgBuf As String = ""

      If System.IO.File.Exists(**ログファイルパス**) = False Then
        MsgBuf &= "EXECUTION_TIME" & vbTab
        MsgBuf &= "GC_TOTAL_MEMORY" & vbTab
        MsgBuf &= "PRIVATE_NEMORY" & vbTab
        MsgBuf &= "WORKING_SET" & vbTab
        MsgBuf &= "VIRTUAL_MEMORY" & vbTab
        MsgBuf &= "METHOD_NAME"
        MsgBuf &= vbCrLf
      End If

      MsgBuf &= Date.Now.ToString("yyyy/MM/dd HH:mm:ss:fff") & vbTab
      MsgBuf &= (GC.GetTotalMemory(False) / 1024).ToString("F7").PadLeft(16) & " KB" & vbTab               'マネージド メモリに現在割り当てられているバイト数
      Using currentProcess As System.Diagnostics.Process = System.Diagnostics.Process.GetCurrentProcess()
        currentProcess.Refresh()
        MsgBuf &= (currentProcess.PrivateMemorySize64 / 1024).ToString.PadLeft(8) & " KB" & vbTab          'プロセスに割り当てられたプライベートメモリのバイト数
        MsgBuf &= (currentProcess.WorkingSet64 / 1024).ToString.PadLeft(8) & " KB" & vbTab
        MsgBuf &= (currentProcess.VirtualMemorySize64 / 1024).ToString.PadLeft(8) & " KB" & vbTab
        currentProcess.Close()
      End Using
      MsgBuf &= MethodName

      'WriteLog(**ログファイルパス**, MsgBuf) '自作のログ書込み関数

    Catch ex As Exception
      SaveErrorLog("SaveMemoryLog", ex)
    End Try
  End Sub
```

- GC.GetTotalMemory(False)
  - [公式](https://docs.microsoft.com/ja-jp/dotnet/api/system.gc.gettotalmemory?view=netframework-4.5)
  - マネージド メモリに現在割り当てられているメモリの量

- currentProcess.PrivateMemorySize64
  - [公式](https://docs.microsoft.com/ja-jp/dotnet/api/system.diagnostics.process.privatememorysize64?view=netframework-4.5)
  - プロセスに割り当てられ、他のプロセスと共有できないメモリの量

- currentProcess.WorkingSet64
  - [公式](https://docs.microsoft.com/ja-jp/dotnet/api/system.diagnostics.process.workingset64?view=netframework-4.5)
  - プロセスに割り当てられた物理メモリの量
  - 共有ワーキングセットと専用ワーキングセットの両方が含まれる

- currentProcess.VirtualMemorySize64
  - [公式](https://docs.microsoft.com/ja-jp/dotnet/api/system.diagnostics.process.virtualmemorysize64?view=netframework-4.5)
  - プロセスに割り当てられた仮想メモリの量

## 結果
```
'出力例
EXECUTION_TIME	GC_TOTAL_MEMORY	PRIVATE_NEMORY	WORKING_SET	VIRTUAL_MEMORY	METHOD_NAME
2019/04/16 00:00:00:262	   19989.0546875 KB	   97276 KB	  128232 KB	  816712 KB	
2019/04/16 00:00:01:261	   19988.1015625 KB	   97276 KB	  128232 KB	  816712 KB	
2019/04/16 00:00:02:259	   19994.8984375 KB	   97276 KB	  128232 KB	  816712 KB	
```
jupyter notebokは開くが、カーネルを実行時に「Connection Failed」と表示される


# まとめ
proxyサーバを経由する際に、WebSocketを通していなかったため、Connection Failedしていた。
このエラー文を幾ら検索しても原因がわからず、もし同じ体験をした方か現れたときのためにメモに記します。

# 課題
- jupyter notebookは起動するが
- 「Kernelに接続出来ない」旨のエラーが出る

> Connection failed
>A connection to the notebook server could not be established. The notebook will continue trying to reconnect. Check your network connection or notebook server configuration.

![bed8ea2ac0cb0c60d46f71fbca625e3b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396599/038440b4-113b-b028-ed61-45927a158fa8.png)


# 実施したこと
- CGPにインスタンスを作成し、port:8888を許可する設定
- Anacondaのインストールし、Python 3.6環境を設定
- jupyter notebookの起動

`$ jupyter notebook --ip=0.0.0.0`


# 原因
ChromeのJavaScriptのコンソールに色々出ていました。 
proxy serverを経由する際に、web socketが通過できていなかった。

>WebSocket connection to 'ws://35.230.57.27:8888/api/kernels/a27c9e76-b148-42ff-acb2-58702645feca/channels?session_id=2967f80aedd84a258f9538187dcba2f1' failed: Establishing a tunnel via proxy server failed.

![bdb4971337015fe667ec4baf4f68b3d1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396599/e6e5d1f3-2454-ad1a-f31a-daabedefe551.png)
BIG QUERY におけるSQL文の基礎

#BIG QUERY におけるSQL文


##基本
>SELECT * FROM "$TABLE"

TABLEから全てのデータを取り出す。

##条件付き
>SELECT * FROM "TABLE" WHERE COLUMN_NAME="hoge"

TABLEの[COLUMN_NAME]という名前のカラムがhogeとなるデータのみを取り出す。

##ソートする
>SELECT * FROM "TABLE" order by COLUMN_NAME

[COLUMN_NAME]という名前のカラムの中身の数値順にソートしてデータを取得する
Vuexのactionをactionの中で再帰的に呼ぶ

Vuexのactionをデータがロードし終わるまで再帰的に呼び出す

### Vuexのアクションのコンテキストオブジェクトについて
https://vuex.vuejs.org/ja/guide/actions.html
actioonの第一引数に渡されるコンテキストオブジェクトは
dispatchやstateを呼ぶことが可能

### 実装
stateのitemsを見てlengthが0ならもう一度loopを呼ぶ
別の場所でstate.itemsに値が入ったらreturn

```js
export default {
  state {
    items: []
  },
  actions {
    loop({ stage, dispatch }) {
      if (state.items.length > 0) {
        console.log('loaded');
        return;
      } else {
        setTimout(() => dispatch.loop(), 500);
      }
    }
  }
}
```
[iOS][Swift] 設定画面に【アプリのバージョン番号】【CocoaPods導入したライブラリのライセンス】を表示する

![Version.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82835/94c636fc-4abf-4869-dc3e-b5be25fca7a4.png)

## バージョン番号表示

### Settings.bundleを追加

プロジェクトのトップを選択。（Settings.bundleがプロジェクト直下に作成される。）
File -> New -> File... -> Settings Bundleを選択。
Settings.bundleの中のRoot.plistを以下のように編集。

```
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>StringsTable</key>
	<string>Root</string>
	<key>PreferenceSpecifiers</key>
	<array>
		<dict>
			<key>Type</key>
			<string>PSGroupSpecifier</string>
			<key>Title</key>
			<string>About</string>
		</dict>
        <dict>
            <key>Type</key>
            <string>PSTitleValueSpecifier</string>
            <key>Title</key>
            <string>Version</string>
            <key>Key</key>
            <string>name_preference</string>
            <key>DefaultValue</key>
            <string></string>
        </dict>
        <dict>
            <key>Type</key>
            <string>PSChildPaneSpecifier</string>
            <key>Title</key>
            <string>Acknowledgements</string>
            <key>File</key>
            <string>Acknowledgements</string>
        </dict>
	</array>
</dict>
</plist>
```

### Run Scriptを追加
<img width="989" alt="New.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82835/fff17b7a-fc60-ae98-4213-60ceef966644.png">

<img width="1085" alt="Run.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82835/f9e66856-b893-2192-02fc-576c259d64de.png">

Run Script

```
version=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "$PROJECT_DIR/$INFOPLIST_FILE")
build=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$PROJECT_DIR/$INFOPLIST_FILE")
/usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:1:DefaultValue $version ($build)" "$CODESIGNING_FOLDER_PATH/Settings.bundle/Root.plist"
```

参考：https://stackoverflow.com/a/39030153

## Cocoapodsで導入したライブラリのライセンス表記

pod installを実行後、どこにacknowledgements.plistが作成されているかを確認します。

```
Pods/Target Support Files/Pods-[Target]/Pods-[Target]-Acknowledgements.plist
```

Podfileに以下を記載します。

```
post_install do | installer |
  require 'fileutils'
  FileUtils.cp_r('Pods/Target Support Files/Pods-[Target]/Pods-[Target]-Acknowledgements.plist', 'Settings.bundle/Acknowledgements.plist', :remove_destination => true)
end
```
久しぶりにJavaScriptでHTTPリクエスト処理を書こうとしたら、もはや別言語だった件

```javascript
function main() {
  (async () => {
    try {
      const response = await fetch('/cms/api/csv/upload', createFetchPostData());
      const json = await response.json();
      console.log(json);
    } catch (error) {
      console.log(error);
    }
  })();
}

function createFetchPostData(data = {}) {
  return {
    method: 'POST', // *GET, POST, PUT, DELETE, etc.
    mode: 'cors', // no-cors, cors, *same-origin
    cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached
    credentials: 'same-origin', // include, same-origin, *omit
    headers: {
      'Content-Type': 'application/json; charset=utf-8',
      // 'Content-Type': 'application/x-www-form-urlencoded',
    },
    redirect: 'follow', // manual, *follow, error
    referrer: 'no-referrer', // no-referrer, *client
    body: JSON.stringify(data), // 本文のデータ型は 'Content-Type' ヘッダーと一致する必要があります
  };
}

main() // 実行！！
```

便利なんだろうけど、アロー演算子とかスコープが変わったりするし、うーむ。って感じ。

Bootstrapも5からjQuery無くすっていうし、ネイティブJSがトレンドかなぁと思ったり。
Elmで日付を扱う0.19編

# はじめに

0.19のtime周りを調べました

[こっちの記事](https://qiita.com/tmKentauros/items/0680bb98e305e885196a)の二番煎じです

自分が使うところをまとめ直したいうか、今のお仕事プロジェクトの備忘録的なのです

# package概略

いつもは関連package全部一応みてるんですがtime, date周りはめんどうになったので全部は見てません。あとは頼んだ

## いにしえ編

0.18までの状況を先に復習します

[elm-lang/core/Time](https://package.elm-lang.org/packages/elm-lang/core/latest/Time)
[elm-lang/core/Date](https://package.elm-lang.org/packages/elm-lang/core/latest/Date)

> 古いpackageはサイトでは検索に引っかからないのでないように見えますが普通にpackage名指定すれば見えます

TimeとDateがあったよー、TimeはFloatだったよーって感じです

## 現代編

[elm/time](https://package.elm-lang.org/packages/elm/time/latest/)

READMEにいろいろ書いてあるのでgoogle翻訳かけて読んできてください
読みましたか？読みましたね？まあ読まなくてもいいですけど
Human Readableなどviewのための都合！PosixとZoneこそが正義！ってなりました？まあ状況に応じて考えましょう

Date型がなくなってPosix timeとZoneを組み合わせて日付等は算出するようになった感じです

Posix timeは[wikipedia](https://ja.wikipedia.org/wiki/UNIX%E6%99%82%E9%96%93)によると`1970年1月1日午前0時0分0秒から形式的な経過秒数として表される`らしいです

```elm
type Posix = Posix Int
```

Intですね

`elm/*`で提供されてる関連packageは他にはありません。readmeに書いてあったようにあとはちょっとコミュニティでいろいろやってみてねって感じです

## ISO 8601編

[rtfeldman/elm-iso8601-date-strings](https://package.elm-lang.org/packages/rtfeldman/elm-iso8601-date-strings/latest/)

安心と信頼のfeldmanです

ISO 8601は`yyyy-MM-ddTHH:mm:ss`のような日付形式です
APIから送ってくる値がこの形式ならこのpackageを使って変換しましょう
decoderもついてるので組み込めます

## TimeZone編

readmeに書いてありましたが IANA Time Zone Databaseとかいうのがあってtime zoneが登録されているらしいです。package作ってねみたいに書いてありましたがそれがこれです

[justinmimbs/timezone-data](https://package.elm-lang.org/packages/justinmimbs/timezone-data/latest/)

Zoneを引けるようになってます

わたしはviewに上からZoneを渡していくのが面倒だったので[`asia__tokyo`](https://package.elm-lang.org/packages/justinmimbs/timezone-data/latest/TimeZone#asia__tokyo)をそのまま使ってます。日本でしか使わないアプリだし、いいよね……

## Extra編

[justinmimbs/time-extra](https://package.elm-lang.org/packages/justinmimbs/time-extra/latest/Time-Extra)

日付や時間に一個ずつ変換するのがめんどうな人ように一気に変換する関数や、算術関数が入ってます（日付単位や時間単位で足したりするやつ）

こちらはtimeの拡張で下がDateの拡張です

## 現代によみがえるDate編

[justinmimbs/date](https://package.elm-lang.org/packages/justinmimbs/date/latest/Date)

`Rata Die`という日付に数字を割り付ける方法を下に敷いたpackageみたいです

算術系、比較系、[フォーマット](https://package.elm-lang.org/packages/justinmimbs/date/latest/Date#format)などが入ってます

フォーマットがちょっと便利かなと思いましたが、自分でやればいい気もします

# 使い方

現プロジェクトの現状

- 基本Model内はPosixを持つ
- API経由で受けるときは`Iso8601.decoder`で変換します
- Zoneはめんどうになったので`TimeZone.asia__tokyo`を固定値で使ってます
    - 動的に変えないといけなくなったら考えます
- view内でZoneとDate.formatで文字列に変換してます
- スケジューリング機能をそのうち付ける予定なのでユーザーが入力する日付の形式その他はそのときにまた考える


## 終わり

ということでjustinmimbsのpackage紹介でした
【WinActor】カンマ区切りのデータを一次元配列に格納する方法

一次元配列の初期化や格納・参照方法は以前紹介しましたが、今回は、カンマ区切りのデータを一次元配列に格納する方法について紹介します。
あくまで一例ですので、参考にしていただければと思います。

■必要な変数
・一次元配列
・配列用インデックス
・配列要素数
・カンマ区切りデータ
・分割データ取得用
・空白用変数

１．初期値設定
・配列用インデックス：1(0だと領域外でエラーになる)
・配列要素数：0
・カンマ区切りデータ：カンマ区切りの必要なデータ(例：1,2,3)
・分割データ取得用：ダミー(空白でなければなんでもいい)
・空白用変数：

※変数一覧から初期値を設定できますので、それでもOKです

配列の初期化はこちらを参照してください。
[【WinActor】一次元配列](https://qiita.com/silkriver/items/43ef1c627fc5c6814796)


２．ループ
繰り返し条件：分割データ取得用 <> 空白

３．例外処理ノードをループの中に入れる

４．正常系処理

４－１．文字列分割
使用ノード：07_文字列操作\02_切り出し・分割\文字列分割
分割元文字列：カンマ区切りデータ
区切文字列：,(カンマ)
インデックス：配列要素数
分割文字列：分割データ取得用

４－２．分割した文字列を配列に格納
使用ノード：03_変数\02_辞書と配列\１次元配列操作(情報挿入)
配列名：一次元配列
インデックス：配列用インデックス
情報：分割データ取得用
※スクリプトの変更が必要になりますので、こちらを参照してください
[【WinActor】一次元配列](https://qiita.com/silkriver/items/43ef1c627fc5c6814796)

４－３．インデックスカウントアップ
使用ノード：カウントアップ
計算結果：インデックス
加算値：1

４－４．配列要素数
使用ノード：カウントアップ
計算結果：配列要素数
加算値：1


５．異常系

５－１．分割データ取得用を空白にする
使用ノード：変数値設定
変数名：分割データ取得用
値：空白用変数

異常系に行く条件としては、カンマ区切りのデータがなくなることですので、
上記のロジックを組めば、データの末尾まで配列に格納して、ループから抜けられることができます。
ただし、カンマ区切りデータにカンマが1つもない場合は、一度も配列に格納されることなく異常系の処理に行きますので、異常系側に「配列要素数が0の場合、配列の1番目に格納する」などの処理が必要になります。


以上が、カンマ区切りのデータを一次元配列に格納する方法でした。
VuetifyでQiita風UIを作る - 目次

みんな大好き(?)Vuetifyですが、割と日本語での記事は多くありません。(自分調べ)
今担当しているプロジェクトでVuetifyを採用して２年ほど経って、いろいろと知見がたまってきたので、Qiita風のUIを作りながら画面構築のテクニックを公開していきたいと思います。
ある程度コンポーネントごと区切って公開していきます。
(最終的には`Nuxt.js`でアプリケーションとして公開できるといいな :kissing:)

# Vuetifyとは

https://vuetifyjs.com/ja/

VuetifyはVue.jsで利用できる、マテリアルコンポーネントフレームワークです。
あらかじめWEBアプリケーションを構築するにあたって必要なコンポーネントはほとんど揃っているので、スタートアップ時のモック作成や、画面を仮組みするときに力を発揮します。(運用でも問題なく使えます。)
スタイルを書かずに綺麗な画面を作れるので、フロントエンドエンジニアのモチベーションが上がることも間違いなしです。 :joy:

# 目次

あくまでも`Qiita風`なのでご了承を。
(そもそも完コピするならVuetify必要ないですし :sunglasses: )

ちょっとずつ書いていきます。
(Vuetify2がリリースされたので、書き直し中。。。)

- ヘッダー
    - [チーム切り替えメニュー](https://qiita.com/totto357/items/31879483187a1db410b9)
    - ホーム・コミュニティーメニュー
    - キーワード検索フィールド
    - ストック一覧リンク
    - 通知メニュー
    - ユーザーメニュー
    - レイアウト・レスポンシブ対応
- フッター
- トップ画面
    - タブ
    - 記事一覧

# そのほか

こんなコンポーネントどう作るの？とか質問ありましたら、コメントください。
chmodとchown, chgrpを使うときの権限

- Permission関連のコマンドの権限を自分用にメモ

# 各ユーザステータスにおけるchmod, chown, chgrpの使用権限

|ユーザのステータス|ルート|ファイル・ディレクトリの所有者|所有者ではないがグループに所属|所有者でなくグループの所属でもない|
|:---:|:---:|:---:|:---:|:---:|
|chmod|〇|〇|×|×|×|
|chown|〇|×|×|×|
|chgrp|〇|(※1)|×|×|
※1: 変更後のグループに所属している場合のみ可能

# 注意
- 対象のファイル・ディレクトリの権限が777でも000でもchmod, chown, chgrpには関係ない
React Nativeのバージョンアップ時にやっていること

何度かReact Nativeアプリのバージョンアップを経験して、ある程度バージョンアップ手順が自分の中で固まってきたので公開します。

# 2023/01/10追記
upgrade-helperを使うと任意のバージョンから任意のバージョンに変更するために必要な差分を確認することができるのでかなり便利です
https://react-native-community.github.io/upgrade-helper/

# React Native自体のバージョンアップ
## リリースノートを反映
これが一番大事です。
既存アプリのReact Nativeのバージョンから、最新のReact Nativeのバージョンまでの[リリースノート](https://github.com/facebook/react-native/releases)を全て読み、各バージョンアップで必要な作業を全て行います。
リリースノートにはiOSのframeworkの追加やAndroidのビルドSDKのバージョンアップ等の重要な情報が含まれます。
数が増えると大変ですしエラーが大量に出ると心が折れるので、パッチレベルでのバージョンアップでも即座に対応するのがReact Nativeでは大切だと思います。

## スケルトンとの比較
これを飛ばして安易にpackage.jsonの`react-native`のバージョンだけ上げると、エラーたくさんでたりして時間を取られることになります。

やり方はまず`react-native init NewApp` で最新のスケルトンアプリを作成します。
基本的にこの最新のスケルトンアプリと、バージョンアップ対象の既存のアプリを比較して必要な変更を適宜取り入れていきます。

## package.json
スケルトンアプリの`packages.json` と既存アプリの `package.json` を比較し、依存ライブラリのバージョンアップを行います。
既存に無いものは、それが必要になっているということなので追加します。

## build.gradle
`android/build.gradle` に反映が必要な変更があれば適用します。
特に注意してみるのが ビルドSDKのバージョンと `com.android.tools.build:gradle` のバージョンです。

`android/gradle/wrapper` 以下のファイルも変更があればまるっとコピーします。

## その他のファイル
プロジェクト直下のその他のファイルを全て目視で確認して変更があれば、必要かあたりをつけて判定します。

- `.flowconfig` は末尾のバージョンが異なっていたら、まるっとファイルコピーしています。
- `.gitignore` はプロジェクトで変更している可能性が大きいと思うので、まるっとコピーはせず必要な変更を反映。(変更しなくてもコミット時にわかるからあまり重視しなくてよい)

# 一度ビルド
React Native自体のバージョンアップが終わったら、 [キャッシュを削除](https://qiita.com/sekitaka_1214/items/4f13400eabf7a4250700)  してから、祈りを込めて一度ビルドしてみましょう。
Android/iOSともに正常にビルドできれば動作確認に移ります。
ビルドできなかったら、エラーメッセージをぐぐるなりして解決方法を探します。

## 既存アプリの依存パッケージのバージョンアップ
React Nativeを最新にしたことで既存アプリが依存しているパッケージがビルドできなくなっている可能性もあります。
各パッケージのGitHubのREADMEやissueを確認し、最新のRNに対応しているバージョンに適宜変更します。
特に情報がない場合は、既存のバージョンのままにしておきます。

※React Nativeの最新にライブラリ側のバージョンが追いついてないこともあります。ちょろっと自前でパッチあてたり、ライブラリのバージョンアップをまったりいろいろな選択があります。

# ビルドと動作確認
Android/iOSともに正常にビルドできればテストと動作確認をしてバージョンアップの作業は終了です。

# まとめ
手順にすると簡単ですが、これ通りにやってもやはりビルドできないことがあります。
そんな時はGoogle先生に聞いてコツコツ解決していくしかありません。
既存アプリのバージョンと最新のReact Nativeのバージョンの差が大きくなるほどバージョンアップは大変になってきます。
こまめなバージョンアップを心がけましょう。
scp でタイムアウトする時には -o オプションで ConnectTimeout を設定する

# コマンド例

```
$ scp -C -o 'ConnectTimeout 600' ${コピー元} ${コピー先}
```

`ConnectTimeout` の単位は秒なので、上記の場合タイムアウト時間は10分


# `-o` オプションの意味


> 設定ファイル ssh_config(5) で使われている形式のオプションを ssh に渡すために使います。 これは scp が独立したコマンドラインオプションを持っていないような 項目を設定するのに便利です。 下のリストにあるオプションの詳細と可能な値については、 ssh_config(5) を参照してください。

https://nxmnpg.lemoda.net/ja/1/scp
TableViewCellの選択状態を管理する

UITableViewには選択したcellにチェックマークをつける機能が標準でありますが、アイコンなどを使って独自に選択状態を表現したい場合があるかと思います。
その場合はCellの`func setSelected(_ selected: Bool, animated: Bool)`を使用します。

##やりたいこと
cell選択時に左のチェックマーク(画像)を切り替える
![Image from iOS (3).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106260/93f2d526-2552-2a68-5083-d8d9bfebefa3.jpeg)


##cell側の処理
1. `func setSelected(_ selected: Bool, animated: Bool)`をoverrideする(新規でCellのファイルを作るとデフォルトでoverrideされてます）
2. cell選択時に`func setSelected(_ selected: Bool, animated: Bool)`が呼ばれるので、`selected`をみてUIを更新する

```swift
override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    self.checkImageView.image = selected ? UIImage(named: "icons8Checked")! : UIImage(named: "icons8Unchecked")!
}
```

##指定したcellを選択済みの状態で表示する
画面遷移時にデフォルトで選択済みにしたい場合はこちら

1. `selectRow(at indexPath: IndexPath?, animated: Bool, scrollPosition: UITableView.ScrollPosition)`で選択済みにしたいcellのindexPathを指定する

```swift
self.tableView.selectRow(at: IndexPath(row: 2, section: 0), animated: false, scrollPosition: .none)
```
【VBA】アクティブでないシートに対する処理でエラー

盲点でしたｗ
メモとして残します。

##状況
For Eachでワークシートを検索して、特定のワークシートに対してセル書式変換を行う。

```vb
Dim k As Integer: k = 1
For Each sh In WorkSheets
    If sh.Name = "XXXXX" Then
        sh.Range(Columns(1), Columns(1)).NumberFormat = "@"
    End If
Next
```

##発生した事象

```vb
sh.Range(Columns(1), Columns(1)).NumberFormat = "@"
```
の箇所でエラー。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/69472a10-db5e-de4c-1c7e-d79ba963ac75.png)

##解決方法
処理対象のシートをアクティブにする。
アクティブでないシートに対しての処理はエラーとなってしまうため。

```vb
Dim k As Integer: k = 1
For Each sh In WorkSheets
    If sh.Name = "XXXXX" Then
        sh.Activate '追加
        sh.Range(Columns(1), Columns(1)).NumberFormat = "@"
    End If
Next
```
Docker for windows 使用で社内認証プロキシ経由のDocker pullを行う方法

備忘録

1. Dockerのタスクトレイアイコンを右クリック＞Settings＞Proxies

2. "Manual Proxy Configuration"のラジオボタンを選択

3. http://ユーザ名:プロキシPW@プロキシホスト:プロキシポート/
を入力、"Use same for both"のチェックはそのままにしています

4. Apply、Dockerが再起動したら実際にPullしてみる

以上


(2020/2/13 追記)
企業によっては、プロキシのユーザ名などがメールアドレスとなっており
"xxx@domain.com" などとなってしまうケースがあります

その場合はURLエンコードの記述に則り（"RFC3896"でググると良いと思います）、
ユーザ名の@(アットマーク)部分は"%40"と表記する必要があります

× user@company.com@company.proxy.com:8080/
○ user%40company.com@company.proxy.com:8080/

Dockerに限らず、pythonや他の実行環境にも適用できます
場合によってはhttpでなくhttpsにしておく必要があるケースもあります
How to Choose Your First AI Project 和訳してみた

##はじめに

今回は2019年2月6日に Harvard Business Review に掲載されていた記事を、簡単にまとめてみました。元記事の執筆者は、Coursera の Machine Learning でも有名な Andrew Ng 氏です。

■ How to Choose Your First AI Project
https://hbr.org/2019/02/how-to-choose-your-first-ai-project


Andrew Ng 氏と、彼が提供している Coursera のコースについては下記 URL を参照下さい。

■　Andrew Ng
https://www.coursera.org/instructor/andrewng

■ Machine Learning
https://www.coursera.org/learn/machine-learning




##記事の内容

この How to Choose Your First AI Project は、最初に取り組むべき AI project についての記事となっております。
記事では、最初に取り組むべき AI project は pilot プロジェクト（簡単に言うと、検証実験レベルのもの）であることを前提として話しております。Pilot project から始めることで、企業側は AI 製品を作り出すためのノウハウや知識を得ることができるため、と筆者は述べています。

##5 traits of a strong AI pilot project

ここでは、ステークホルダ達に投資してもらうために企業が取り組むべき AI pilot project として必要な5つの条件について紹介されています。その5つの条件は、以下となります。

- Does the project give you a quick win?（短期間で達成可能なプロジェクトか？）
 - 6~12ヶ月で成功率の高いプロジェクトを、できれば複数行うのが理想
  
- Is the project either too trivial or too unwieldy in size?（プロジェクトの規模は適切な大きさか？）
 - 少なくとも今後の AI project の投資に繋がるだけの価値のある内容かどうか
 
- Is your project specific to your industry?（project は業界のニーズに合っているか？）
 -  同業に成果やメリットが伝わりやすい AI project を行うこと

- Are you accelerating your pilot project with credible partners?（信用できるパートナと pilot project を行えているか）
 - project を早く完了するには、外部からの信頼できるパートナも重要である

- Is your project creating value?（project は価値を生んでいるか？）
  - AI project は主に以下の3つのどれかの価値を生むが、それが生まれているかどうか
     - コスト削減
     - 収益アップ
     - 新たなビジネス

以上が、AI pilot project として企業が取り組む際に必要な5つの条件です。

##Setting up your AI project for success
5つの条件は分かったところで、AI project を成功させるには、実際にどの様な準備が必要になるのでしょうか。
その準備内容は、主に下記の4つとなります。

- Appoint a leader（リーダを選ぶ）
 - 職場の部門や部署の垣根を越えて働くことができ、そして AI との橋渡しもできる人材（つまり万能な人）

- Conduct business value and technical diligence（ビジネス的価値と技術的成果）
 - ビジネス上の価値だけでなく、技術的にも可能かどうかは確認すること 

- Build a small team（少人数チームを編成）
 -  15人くらいの少人数チームで始められるものが望ましい

- Communicate（社内の人間に周知させるというPR的な活動）
 -  自分たちの プロジェクト を社内の人間や CEO に周知させるといったアピールも重要



##おわりに
How to Choose Your First AI Project の記事の簡単なまとめは、以上となります。
これから AI の実装や導入を行おう、または プロジェクト に取り組もうと考えている方は、ぜひ一度この記事を読んで見て下さい。
[備忘録]Angularでwrapした領域でDragDropがうまくいかない

# Angularでwrapした領域でDragDropがうまくいかない
[material.angular.cdk](https://material.angular.io/cdk/drag-drop/overview)でdragdropやってました。
横だけ、縦だけならうまく行くが、横に並べた項目をwrapして複数行にした場合は思う通りにDragDropできなかった。。。

# 対策
SortableJSに変更した。(会社の人が探してくれた)
https://sortablejs.github.io/Sortable/
[備忘録]AngularでngOnChangesイベントが検知できなかった話(参照)

# 問題
Angularで `ngOnChanges` イベントが検知できなかった
[tabulator](http://tabulator.info/)を使用していたが、`@Input()` の値を更新しても `ngOnChanges` に入ってこない。。。

# 原因
参照が切れていない

親コンポーネントから子コンポーネントに渡した`変数A`を変更していたが、参照が切れていないので変更が検知されていなかった可能性あり

# 対策
deepcopyなど
特定の文字数のディレクトリ名の先頭に0をつける

- 5桁と6桁の数字の名前が混在したディレクトリ群から、5桁のものだけ先頭に0をつける必要があったので自分用にメモ

#ディレクトリ名の先頭に0をつける

```
$ ls -F
12345/ 23456/ 345678/ 456789/
```
-Fオプションでディレクトリ名末尾にスラッシュがつく

    $ for dirname in `ls -F | grep -x ...../`
    > do
    > mv $dirname 0$dirname
    > done

grepの-xオプションで、部分一致ではなく完全一致のときのみ抽出するようにする

```
$ ls
012345/ 023456/ 345678/ 456789/
```
ユーザー管理のためにdeviseインストールしてみる

Railsでユーザーにメール送ったり、認証したりするのにdeviseが便利。
今までいちいちログイン処理書いてました・・・

という事でdeviseを少し使ってみました！
機能が多そうなので、今回は、インストールしてみるところだけまとめます。

```rb
rails new devise
cd devise
```

Gemfilにdevise追加

```rb
gem 'devise'
```
bundle install実行

```rb
bundle install
```
deviseをインストール

```
rails g devise:install
```

インストールすると、generat deviseでモデルが作れます。

```
rails g devise User
```

実行されました！

```
Running via Spring preloader in process 40089
      invoke  active_record
      create    db/migrate/20190415230754_devise_create_users.rb
      create    app/models/user.rb
      invoke    test_unit
      create      test/models/user_test.rb
      create      test/fixtures/users.yml
      insert    app/models/user.rb
       route  devise_for :users
```

dbのマイグレーションを行います。

```
rails db:migrate
```

これでログイン画面が表示されます
localhost:3000/users/sign_up


しっかり表示されているので、これでコントローラーで設定すれば、ログイン機能が使えるって事か。
今までフルスクラッチで書いていたのですが、もうすでにgemあるよってものは、使っていこうと思いました。

もう少し理解してから、また後でまとめます！
データの可視化シリーズ 第1弾 - はじめに

# データの可視化シリーズ 第1弾 - はじめに

こんにちは

Exploratoryの[白戸](https://exploratory.io/author/GMq1Qom5tS/notes)です。
 
今回から、**データの可視化(Data Visualization)** シリーズを書いていきます！


# データの可視化とは


データを可視化するだけでも、どこにどんな問題がありそうか直感的に知ることができます。

例えば、各国の売上を知りたいとします。

このようなデータでは、各国の売上を比べることは難しいでしょう。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192148/fdf2b53d-1705-08ac-7073-3b113cdbf4d0.png)


しかし、下記のチャートのようにデータを可視化するだけで、どの国の売上が高いか低いかなどがすぐにわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192148/32ec6271-f177-01a7-faa0-2a96f3567113.png)



そして、可視化したチャートから得られる情報を観察し、新たな質問を見つけることで次のステップに進むことができます。

今回のシリーズではこの可視化の部分を中心に紹介していきます。


# 使用データ概要＆ダウンロード

データの可視化シリーズでは**activities**というデータを使用していきます。

このactivitiesは、世界中でPC用のソフトウェアを提供している企業を想定しています。そして、経営上の目標は売上を伸ばすことです。

データの項目については下記の通りです。

**データ項目**

* Country(国名)
* userid(ユーザー識別番号)
* first_activity_date(最初のアクセス日)
* last_activity_date(最後のアクセス日)
* os(使用端末)
* counts(アクセス回数)
* duration(最初のアクセスから最後のアクセスまでの経過日数)
* date_month(初回アクセス月)


**使用しているactivitiesのデータを公開するので、インポートして、次回から始まる可視化シリーズを一緒に進めていきましょう！**

データは[こちらからダウンロード](https://exploratory.io/data/GMq1Qom5tS/activities-KXu2AzG5Dc)してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192148/3dcc5e5c-b854-701a-f2fb-eb70ef4e514d.png)


# データのインポートの仕方


ダウンロードしたactivitiesのデータをインポートしていきましょう。

まず、activitiesのデータを保存したいプロジェクトを選択してください。
もし、プロジェクトが無い場合は、新規作成をクリックしてお好きな名前をつけてプロジェクトを作成してください。

次に、データフレーム横にある＋ボタンをクリックし、EDFをインポートという項目を選択しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192148/f4e44b1a-9bc7-51c4-7211-c6eb157cdbef.png)

先ほどDLした、activities.edfのファイルを選択してください。すると下記のように、テーブルが表示されると思いますので、確認を押してください。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192148/e4aae1ec-b965-00fa-d0fc-e94a5706cfcb.png)


名前のところに、activitiesと入力し、作成をクリックしてください。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192148/bc1222b2-c8c1-ec96-9385-dc5c1c84fe3b.png)



これで、インポート完了です。

データをインポートすると、次のようにサマリ・ビューが最初に表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192148/825e89e0-1b68-f238-f77b-1373e88c309e.png)



このサマリ・ビューをみると、11カ国(Other含む)からアクセスされていることがわかります。また、useridが一意な数で2,885あることからユーザー数は2,885人いるようです。durationからはユーザーの平均経過日数は116日で、中央値は110日のため、あまりばらつきはありませんね。

これで、activitiesのインポートとデータの概要を掴めましたね。それでは次回から、データの可視化を実際に手を動かしながら学んでいきましょう！

初回は**[データの可視化シリーズ 第2弾 - バーチャートを使って「比べる」](https://qiita.com/takatoshiroto/items/a9db605ff3ce18982a55)** についてです。


ぜひ読んでみてください！

-----

# Exploratoryデータ・アカデミー

データの可視化、またはデータ分析に関してもっと知りたい、学びたいという方は、私達が提供しているトレーニングやセミナーに参加してみてください。

[こちら](https://ja.exploratory.io/data-academy-jp?utm_campaign=chart_intro_1&utm_medium=blog&utm_source=qiita)のExploratoryデータ・アカデミーのページに詳細情報があります。

データを使ってより良い意思決定を行っていきたいと言う方は、ぜひこの機会に参加をご検討ください！
Watson Open Scaleを使ってみた

# Watson Open Scaleとは
- 用途：AIの監視ツール
- 特徴：信頼性・透明性・説明可能性の可視化
- 説明：AIの判定がどのように行われているかを説明する。また、バイアスを自動的に検出して軽減し、公正で信頼できる結果を生み出す。
- 仕組み：モデルに対する実際の入力と出力からシミュレーションでモデルを再構築し分析する

# 機能確認
1. 正確性、公平性の確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271751/eb548177-7f9e-330a-ec55-15bb0a516627.png)
2. 時系列の本番環境での与信判断確認

* Age 19 -25と Sex femaleへのレスポンスの状況を確認できるように設定しています。若年層はno riskと判断しているようです。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271751/b72134b4-5dfd-3335-01d9-8ce1395eac36.png)
3. 年齢別与信判断確認

* 各年齢に対して、モデルの判断状況が一目でわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271751/60d75bb4-8e66-0590-677f-7239a552ef91.png)
4. 性別ごとの与信判断確認

* これで性別ごとに差があれば、バイアスがかかっているということになるのでしょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271751/0819097e-b21f-da59-1e0f-cb921e14c52d.png)
5. 特徴量の寄与度の確認

* 50歳だと、リスクが高いということですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271751/345bbcc0-b50f-c7ed-a8d7-4c6f231f0b18.png)
Jetson Nanoの機械学習ベンチマークテスト

# Jetson Nano

Nvidiaより発売された、Jetsonファミリの中で最も小型のデバイス。

<img width="375" alt="07014815-C4D0-4C1C-ADC7-AE32A0BF9990.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233208/7cba74c4-eb1b-0827-9788-aadf128b751c.jpeg">

上の写真は開発者ボード。

<img width="375" alt="35B7590B-4E2F-4275-8A7D-C71AAEC5571C.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233208/3f2e109f-721a-bcec-19b7-6054fcb47bf2.jpeg">

GPU搭載で、4GBのメモリ搭載。エッジ側でパワフルな処理ができる。

<img width="375" alt="9D116F64-D989-4EFB-9B62-D192D8CB1037.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233208/9dfa17c6-7daa-215d-3b92-059ebea48acc.jpeg">

写真は全て[Nvidia] (https://www.nvidia.com/ja-jp/autonomous-machines/embedded-systems/jetson-nano/)
のサイトから

GPIOピン配置、USBポートなど、ラズパイ を強く意識した製品になっている。ただし無線LANはなし。公式OSはubuntu(18?)ライク

## 使用感

- guiモードで使っているがもっさりした感は今のところなし
- オフィスソフトのプリインストールいらない
- anaconda（python用仮想開発環境）使えないので、素のままライブラリをインストール

## DL用フレームワーク
### tensorflow
- 公式がパッケージを提供しているので簡単にインストール完了

https://devtalk.nvidia.com/default/topic/1048776/jetson-nano/official-tensorflow-for-jetson-nano-/

### PyTorch
これも公式サイトにあり。特に問題なくインストール完了

https://devtalk.nvidia.com/default/topic/1049071/pytorch-for-jetson-nano/

## ベンチマーク

PyTorchのmnist example にあるコードmain.pyを使用。CNN2層、FC2層の簡単なネットワーク。デフォルト値のままで、モデルの保存（書き込み）は行わず60000イタレーション実行。（64エポック）。GPU付きのマシーンはCPUオンリーで動作させるときに—no-cudaオプションを使用

### 下準備
念のためメモリのスワップ領域を拡大。4GBに。（結局使わなかった）
（デフォルトは0）
[Linux（Ubuntu）のswap領域を拡張する]
(https://yukiosugiyama.com/blog/post-2369/amp/#click=https://t.co/)

### 温度上昇

nvidia-smiが入っておらず、gpuの稼働率が分からなかった。Nvidia Cサーバーのguiアプリを入れてもなぜか温度が表示されず。
nvidia-settingもダメ。ここはもう少し調べたい。

![41E184A1-3BBE-4977-825F-9BE33C38C4E0.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233208/75975422-85b7-50e3-bd55-f6b960b55227.jpeg)

写真はtensorflowインストール中のヒートシンクの温度。

ベンチマークテスト中も測ったがほとんど同じ。バカでかいヒートシンクの恩恵か、それともちゃんと回せてるのか？

### 結果

![2C29F9AA-887F-4AD8-BF05-D56F50AAD1F9.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233208/f3c94c5b-8669-03f4-dfe3-63a8fbe1c33c.jpeg)

### 感想

コンパクト、低消費電力なのに、MB12インチよりは早いという結果にそこそこ満足。

ただ、CPUとしてはそこまで（当たり前か）

## 課題

- Nanoのgpuのポテンシャルをどれだけ引き出せてるのか不明。
- ライバルはラズパイ？ラズパイ比較したい（ラズパイ でPyTorch動かないのと、tensorflowのベンチマークもなぜかエラー出るので調査中）
全体の行数がわからないデータからランダムにN行取り出す

テキストデータからランダムにN行取り出す方法ですが、まず「シャッフルしてN行取り出す」というのがあります。
しかし、データが大きいとシャッフルにも大量のメモリが必要になるので、別の方法を考えたいところです。
ここで、全体の行数がわかっていれば簡単に書ける（後で書きます）ところですが、一度行数を調べてから取り出すとなると二度手間になってしまいます。

こういうときは、Perl（-nオプション）で次のように書くと、$n個を配列に格納することができます（順序はランダムではありません）。

```perl
$t = $. <= $n ? $. - 1 : rand($.);
$r[$t] = $_ if $t < $n;
```

スクリプト全体は[このGist](https://gist.github.com/hiroshi-manabe/5259438ef8c30d75c16e596ce4949a04)です。
これを保存して実行可能にしてパスを通せば、次のようにランダム抽出ができます。

```sh
$ randpick -n 5 KEN_ALL.CSV | piconv -f cp932
01665,"08833","0883332","ﾎｯｶｲﾄﾞｳ","ｶﾜｶﾐｸﾞﾝﾃｼｶｶﾞﾁｮｳ","ｻﾂﾄﾓﾅｲｹﾞﾝﾔ","北海道","川上郡弟子屈町","札友内原野",0,0,0,1,0,0
08227,"30801","3080103","ｲﾊﾞﾗｷｹﾝ","ﾁｸｾｲｼ","ﾂｼﾞ","茨城県","筑西市","辻",0,0,0,0,0,0
15202,"940  ","9400872","ﾆｲｶﾞﾀｹﾝ","ﾅｶﾞｵｶｼ","ｲﾅﾊﾞﾏﾁ","新潟県","長岡市","稲葉町",0,0,0,0,0,0
08204,"306  ","3060053","ｲﾊﾞﾗｷｹﾝ","ｺｶﾞｼ","ﾅｶﾀﾞ","茨城県","古河市","中田",0,0,0,0,0,0
26109,"612  ","6128344","ｷｮｳﾄﾌ","ｷｮｳﾄｼﾌｼﾐｸ","ｵｵﾂﾏﾁ","京都府","京都市伏見区","大津町",0,0,0,0,0,0
```

アルゴリズムは[Reservoir sampling](http://en.wikipedia.org/wiki/Reservoir_sampling)というもので、以下の記事に詳しい解説があります。

[大量のテキストからランダムに少数の行を抽出したい - Reservoir Sampling](http://sucrose.hatenablog.com/entry/2014/01/11/004615)

ところで、このアルゴリズムの欠点はO(N)だけメモリを使うというところで、Nが大きくなってくると問題になるかもしれません（そういうことは私のユースケースではあまりないですが）。
そういう場合のために、「全体の行数がわかっているデータからランダムにN行取り出す」スクリプトも書いておきます。
こちらはメモリをほとんど使いません。

```perl
if (rand($all - $. + 1) < $n) {
    print;
    --$n;
}
```
[Gist](https://gist.github.com/hiroshi-manabe/2f2ba6b414fc0dbde9eaa12e85b46d04)

このアルゴリズムは、以下の記事でKnuthの方法として紹介されているものです。

[非復元抽出の高速かつ実装が簡単な方法を考える](https://sleepy-yoshi.hatenablog.com/entry/20130720/p1)

これを使う場合は次のようになります。

```sh
$ wc -l < KEN_ALL.CSV
  124263
$ randpick_a -a 124263 -n 5 KEN_ALL.CSV | piconv -f cp932
13206,"183  ","1830041","ﾄｳｷｮｳﾄ","ﾌﾁｭｳｼ","ｷﾀﾔﾏﾁｮｳ","東京都","府中市","北山町",0,0,1,0,0,0
15222,"94201","9420114","ﾆｲｶﾞﾀｹﾝ","ｼﾞｮｳｴﾂｼ","ｸﾋﾞｷｸｶｷﾉ","新潟県","上越市","頸城区柿野",0,0,0,0,0,0
26106,"600  ","6008167","ｷｮｳﾄﾌ","ｷｮｳﾄｼｼﾓｷﾞｮｳｸ","ﾄｷﾜﾁｮｳ","京都府","京都市下京区","常葉町",0,0,0,0,0,0
27206,"595  ","5950045","ｵｵｻｶﾌ","ｲｽﾞﾐｵｵﾂｼ","ｼﾀﾉﾁｮｳ","大阪府","泉大津市","下之町",0,0,0,0,0,0
36202,"77903","7790305","ﾄｸｼﾏｹﾝ","ﾅﾙﾄｼ","ｵｵｱｻﾁｮｳﾀｶﾊﾞﾀｹ","徳島県","鳴門市","大麻町高畑",0,1,0,0,0,0
```
【Windows】【C++】_statでファイル・ディレクトリの存否チェック

# 目的

Windows環境でC++でプログラミングしている際のファイル・ディレクトリの存否チェック方法を備忘録としてメモする。
C Run-Time Libraries (CRT)の関数`_stat`を使うことで、指定したファイル・ディレクトリの存否チェックができる。

# 関数の概要

```C
int _stat(const char *path, struct _stat *s);
```

## パラメタ

第一引数に存否チェックしたいパス文字列を渡す。

第二引数にはおまじないのように`struct _stat`のポインタを渡す。
第一引数に渡した`path`が存在した場合に、それがファイルなのかディレクトリなのか判別したい場合、この構造体のメンバ`st_mode`のフラグをチェックする（後述の例を参照）。

## 戻り値

`path`が存在すれば`1`、存在しなければ`-1`が返される。

## ワイド文字列版

パス文字列としてワイド文字列を渡したい場合は`_wstat`が使える。第一引数の型が異なる以外は、`_stat`と同様の振る舞いをする。

```C
int _wstat(const wchar_t *path, struct _stat *s);
```

# 例

動作確認はVisual Studio 2017。

```C++
#include <direct.h>
#include <sys/stat.h>
#include <assert.h>
#include <fstream>

int main()
{
	const char* FILE_NAME = "file.txt";
	const char* DIR_NAME = "dir";
	const wchar_t* FILE_NAME_W = L"file.txt";

	// ファイルを作っておく
	{
		std::ofstream ofs(FILE_NAME);
		ofs << "file";
		ofs.close();
	}
	// ディレクトリを作っておく
	_mkdir(DIR_NAME);

	struct _stat s;
	int rc = _stat(FILE_NAME, &s);
	assert(rc == 0);				// 指定パスが存在する場合、戻り値が0
	assert(s.st_mode & _S_IFREG);	// ファイルの場合、_S_IFREGフラグがセットされている

	rc = _stat(DIR_NAME, &s);
	assert(rc == 0);				// 指定パスが存在する場合、戻り値が0
	assert(s.st_mode & _S_IFDIR);	// ディレクトリの場合、_S_IFDIRフラグがセットされている

	rc = _stat("not_exist_file", &s);
	assert(rc == -1);				// 指定パスが存在しない場合、戻り値が-1

	rc = _wstat(FILE_NAME_W, &s);	// ワイド文字列も同様に利用できる。
	assert(rc == 0);				// 指定パスが存在する場合、戻り値が0
	assert(s.st_mode & _S_IFREG);	// ファイルの場合、_S_IFREGフラグがセットされている
}
```

# 参考
[_stat, _stat32, _stat64, _stati64, _stat32i64, _stat64i32, _wstat, _wstat32, _wstat64, _wstati64, _wstat32i64, _wstat64i32 | Microsoft Docs](https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/stat-functions?view=vs-2019)
Rails: How to make an action in ActiveAdmin.register_page

I really struggled with ActiveAdmin's register\_page (writing not associated with a model).

# point 

- Add an action with `page_action` . `page_action` you do not write `page_action` , even routing will not be added! (But why, only the index action does not have to be defined from the beginning) 
- The part corresponding to `index do` ActiveAdmin.register is `content do` in register\_profile! (It is hard to understand) 
- For example, if you write `@text = 'ABCD'` in `index do` , you can not use it in `content do` ! It is an ordinary variable called text. 
- Layout changes are written directly under `controller do` ! Do not write in `def index` or something. 
- `def index` and `content do` correspond. So, for example, what corresponds to `def edit` ? Maybe page\_action: edit do. (Unsettled) 

     ActiveAdmin.register_page "AuthorPage" do content do panel 'メニュー' do link_to '新規作成', admin_authorpage_new_path end table_for authors do column "名前", :name column "性別", :gender column ("name_changed"){ |author| author.name_changed } column ("編集"){ |author| link_to('編集する', admin_authorpage_edit_path(id: author.id)) } end end page_action :new, method: :get page_action :create, method: :post page_action :update, method: :post page_action :edit, method: :get do end controller do layout 'active_admin', only: [:edit, :new] def index @authors = Author.all end def new end def create Author.create(params.require(:author).permit(:name, :gender)) flash[:notice] = '作成しました。' redirect_to admin_authorpage_path end def update flash[:notice] = '編集しました。' author = Author.find(params[:author][:id]) author.update(params.require(:author).permit(:name, :gender)) redirect_to admin_authorpage_edit_path(id: params[:author][:id]) end def edit @author = Author.find(params[:id]) end end end 



# Original by
[Rails: ActiveAdmin.register_page でのアクションの作り方とはまりどころ。](https://qiita.com/Yinaura/items/3572d34e1c00f9f5533e)

# About

[About this translattion](https://qiita.com/YumaInaura/items/7f6fd1e9310a6816469a)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
How to correctly output id in Haml (cause that it is output in solid writing like {id: &quot;my-id&quot;})

     %div{id: "my-id"} 

This is ok.

     %div {id: "my-id"} 

This is NG.

It does not work if there is a space. Because.

     %div#my-id 

It is better to write.



# Original by
[Hamlでidを正しく出力する方法（ {id: "my-id"} のようにベタ書きで出力されてしまう原因）](https://qiita.com/Yinaura/items/9e3afdfe2204e7c12b53)

# About

[About this translattion](https://qiita.com/YumaInaura/items/7f6fd1e9310a6816469a)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Rails: Make Active_Model table_for compatible with i18n

Pass model object by specifying i18n directly to table\_for.

     table_for humans, i18n: Human do column :name column :gender { |result| result.gender } end 

In the model, you only need to include ActiveModel.

     class Human include ActiveModel::Model end 

Set up the locales file. (Because the description place is not under activerecord :)

     ja: activemodel: attributes: human: name: 名前 gender: 性別 



# Original by
[Rails: ActiveModel の table_for を i18nに対応させる ](https://qiita.com/Yinaura/items/403300f663750df81c5e)

# About

[About this translattion](https://qiita.com/YumaInaura/items/7f6fd1e9310a6816469a)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
What to do when Rails &amp; Haml form does not output closing tag or an error occurs.

↓ Move.

     = form_tag do = text_field_tag :text 

↓ It does not move. error. (do not have)

     = form_tag = text_field_tag :text 

↓ Move but close tag Is not output. (There is no do)

     = form_tag = text_field_tag :text 

↓ It does not move. error. (Because there is no second line, it is considered that there is no content of do)

     = form_tag do 

hooked on.



# Original by
[Rails & Haml の form で 閉じタグが出力されなかったりエラーが起きたりするときの対処。](https://qiita.com/Yinaura/items/2b6a0a2a8061027e961d)

# About

[About this translattion](https://qiita.com/YumaInaura/items/7f6fd1e9310a6816469a)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Rails: Measures when VCR says that the request content is not enough

     An HTTP request has been made that VCR does not know how to handle: GET http://example.com 

When I get this error. If you open the YAML file generated by VCR and look at it, the content of the request should be insufficient.

Originally

     - request: method: get uri: http://example.com 

There should be a line called

For the content of the request you are about to send. This error occurs when the content of the cache file is insufficient.

In this case as a solution. You should delete the cache file once and create a new one.

Why did you come to this case? The application uses the cache function, and a VCR cache file is generated with some requests missing.

Because "application-side caching" is enabled or disabled depending on the situation. "VCR file missing request content" and "operation when trying to request everything" are different, and an error occurred accidentally.

VCR files should be created with the caching feature disabled. Because an error occurs only when the contents of the cache file are "insufficient". There is no problem if there are many. (Probably)



# Original by
[Rails : VCRでリクエスト内容が足りないと言われる時の対策](https://qiita.com/Yinaura/items/22908c8f5c866120fc5f)

# About

[About this translattion](https://qiita.com/YumaInaura/items/7f6fd1e9310a6816469a)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Determining the state of selected with Capybara + rspec: Rails

Write as follows.

     expect(page).to have_select('book[id]', selected: 'ソフィーの世界') 

Test example.

     require 'spec_helper' feature '/books', type: :feature do before do visit book_path select 'ソフィーの世界', from: 'book[id]' #いちど選択状態にする end scenario "要素が選択状態になっている" do expect(page).to have_select('book[id]', selected: 'ソフィーの世界') # 選択状態を判定する end end 

     <select id="book" name="book[id]"> <option>我輩は猫である</option> <option>ソフィーの世界</option> <option>ガリバー旅行記</option> </select> 

# point 

- Since Capybara determines "the state seen from the outside", it validates the contents (text seen by the user) of `<option></option>` rather than the value of `<option vallue="">` . 
- Passing to have\_select / select may be the value of `<select id="">` the value of `<select name="">` . It will search for either. (Note that if the same name and id in the same page have the same name, an error will occur. There is no way to specify either id / name) 
- Therefore, I think that it is better to specify in the text of `<label for=""></label>` like [this](http://qiita.com/jnchito/items/607f956263c38a5fec24#%E3%82%BB%E3%83%AC%E3%82%AF%E3%83%88%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9%E3%81%A7%E7%89%B9%E5%AE%9A%E3%81%AE%E9%A0%85%E7%9B%AE%E3%81%8C%E9%81%B8%E6%8A%9E%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%81%93%E3%81%A8%E3%82%92%E6%A4%9C%E8%A8%BC%E3%81%99%E3%82%8B) . 
- have\_select is not a matcher that directly determines selected. Determine the overall state of `<select></select>` . So `selected` in order to determine, selected in option: to specify. 


# Original by
[Capybara + rspec で selected の状態を判定する : Rails](https://qiita.com/Yinaura/items/b9fb268142f4d75f84c8)

# About

[About this translattion](https://qiita.com/YumaInaura/items/7f6fd1e9310a6816469a)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Ruby: Call method with absolute path.

Method call.

     Book.example 

If it is an absolute path, it can be written as follows.

     ::Book.example 

* * *

This is useful, for example, when calling a class of the same name from within a module.

     class Book def self.example p 'Class' end end module Example class Book #このモジュールの example を呼ぶ def self.call_module_method Book.example end # 普通のClass の example を呼ぶ def self.call_class_method ::Book.example end def self.example p 'Module' end end end Example::Book.call_module_method Example::Book.call_class_method 

Execution result

     "Module" "Class" 

* * *

- I don't know if the word "absolute path" is correct or not, but I had a hard time knowing the keyword when I was making a note. 
- I thought I could call it in `Class::Book.example` but it was different. (The part of Class is ignored) 


# Original by
[Ruby: 絶対パスでメソッドを呼び出す。](https://qiita.com/Yinaura/items/bbad6d788f2a0d5463f0)

# About

[About this translattion](https://qiita.com/YumaInaura/items/7f6fd1e9310a6816469a)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Rails: Actively raise a validation error in ActiveModel (raise ActiveRecord :: RecordInvalid)

Class definition.

     class Book include ActiveModel::Model def self.raise_validation_error raise ActiveRecord::RecordInvalid.new(self.new) end end 

And call the method for exception occurrence.

     Book.raise_validation_error 

# point 

- In class method, pass self.new as an argument. 
- In the instance method, pass self as an argument. 
- If you want to pass a detailed exception message, pass the model after judging the validation as an argument. (Described later) 

# necessity 

The new method does not perform validation checks.

     Book.new(params) 

If you want to make a modeltic association. I did validation check at the time of new and wanted to raise an exception.

The following is an example of defining the new! Method.

     class Book include ActiveModel::Model attr_accessor :title validates :title, presence: true def self.new! (params = []) model = self.new(params) # invalid? は破壊的メソッド。ここで model にエラー情報が入る。 if model.invalid? # エラー内容を反映した例外が起こる raise ActiveRecord::RecordInvalid.new(model) end model end end 



# Original by
[Rails: ActiveModel でバリデーションエラーを自分で起こす ( raise ActiveRecord::RecordInvalid )](https://qiita.com/Yinaura/items/24997f0005e187f54210)

# About

[About this translattion](https://qiita.com/YumaInaura/items/7f6fd1e9310a6816469a)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
$ git commit-What is the &quot;last commit&quot; of amend?

`$ git commit --amend` can change "last commit". But what is "immediately before" here?

It is "immediately before" for "the state of the current update work". (Ie the current HEAD)

So the subject of `--amend` changes with the situation. For example, if you are editing a past commit in `$ git rebase -i` (interactive mode), the amend target will change.

If you are not sure, try running `$ git log` . Specifically, the commit displayed here at the top of the list is subject to `$ commit --amend` .

If you feel anxious, it's a good `$ git log` to make sure to make a `$ git log` advance.



# Original by
[$ git commit --amend の「直前のコミット」って何？](https://qiita.com/Yinaura/items/074987d6a4fe12dab3a6)

# About

[About this translattion](https://qiita.com/YumaInaura/items/7f6fd1e9310a6816469a)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Rails: How to test a model when switching validation by action

The article " [Change the validation to be executed at the time of save depending on the situation](http://qiita.com/kadoppe/items/061d137e6022fa099872) " helped.

So what should we do with the test? `.on(:action_name)` .

     class User validates :name, presence: true, on: :index validates_length_of :introduction, maximum: 10000. on: :create end 

     require 'spec_helper' describe User, type: :model do it { should validate_presence_of(:name).on(:index) } it { should validate_length_of(:introduction).is_at_most(10000).on(:create) } end 

* * *

The way of writing is the same in Rspec and Test :: Unit.

However, `validate_numericality_of.on(:index)` could not be done. (Why not write as [GitHub explains](https://github.com/thoughtbot/shoulda-matchers/blob/master/lib/shoulda/matchers/active_model/validate_length_of_matcher.rb) why NoMethodError)



# Original by
[Rails: アクションによってバリデーションを切り替えた時の、モデルのテスト方法](https://qiita.com/Yinaura/items/7cd94e338ae031c04820)

# About

[About this translattion](https://qiita.com/YumaInaura/items/7f6fd1e9310a6816469a)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Add custom actions to ActiveAdmin. (if id is required, not needed)

If you need id, use member\_action.

     ActiveAdmin.register Example do member_action :action_name, method: :get do end 

Path generated: `/admin/examples/:id/action_name`

Use collection\_action if you do not need id.

     ActiveAdmin.register Example do collection_action :action_name, method: :get do end 

Path generated: `/admin/examples/action_name`



# Original by
[ActiveAdmin にカスタムアクションを追加する。(idが必要な場合、必要ない場合)](https://qiita.com/Yinaura/items/3a16fc5f7eb7785b3cdf)

# About

[About this translattion](https://qiita.com/YumaInaura/items/7f6fd1e9310a6816469a)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Rails 4.2+: Rails + Unicorn, the solution when the content of the public directory is 404

## Status 

- If all of the following is in the 404 state, css, javascript and favicon are both invalid. 
- public If you put the file directly below, but can not be accessed from the browser. 

## setting change 

Change the Rails configuration file. (Rails 4.2.3)

     - config.serve_static_files = ENV['RAILS_SERVE_STATIC_FILES'].present? + config.serve_static_files = true 

(In the original setting, the behavior is changed by the environment variable)

Then try restarting unicorn.

* * *

[Settings](http://qiita.com/ShotaKameyama/items/85d71cb1429d119c6f0b) seem to [be different in Rails 4.1 or earlier](http://qiita.com/ShotaKameyama/items/85d71cb1429d119c6f0b) . (Rails 4.1.0)

     - config.serve_static_assets = false + config.serve_static_assets = true 

* * *

The following article was referenced. [Solution when the contents of the directory below public is 404 in Rails (Apache + Unicorn)](http://qiita.com/y_minowa/items/5954907bb30c2ecb43f5)

* * *

You can leave it to a web server without changing the unicorn settings. In the case of nginx, write `location ~ ^/assets/` like this.

     server { listen 80; server_name xxx.xxx.xxx.xxx; server_name example.com; root /path/to/public; location ~ ^/assets/ { root /path/to/public; } } 



# Original by
[Rails 4.2以降: Rails+Unicorn で、publicディレクトリの中身が404になる場合の解決策 ](https://qiita.com/Yinaura/items/d7dc3daefb5825aba474)

# About

[About this translattion](https://qiita.com/YumaInaura/items/7f6fd1e9310a6816469a)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->