OmniAICreator/Qiita-1.07M huggingface dataset:
pycharmでpipを実行するとAttributeError

# 現象
Pythonを入れなおした際、Pycharmでpipしようとすると以下のエラー。

```
AttributeError: module 'pip' has no attribute 'main'
```
cmdからは問題なく実行できる。


日本語の記事が見つからなかったので備忘録がてら。

# 環境
Python: 3.6.5
pip: 10.0.1
Pycharm 2017.3.3

# 対応
pipの9→10のバージョンアップでモジュールの構成が変わったことによる不具合っぽい。
Pycharmのバージョンを[最新版](https://www.jetbrains.com/pycharm/download/#section=windows)にupdateしたらすんなり解決。

# 参考
[PIP module has no attribute “main”](https://stackoverflow.com/questions/43398961/pip-module-has-no-attribute-main)
[Pycharm Virenv AttributeError: module 'pip' has no attribute 'main' occured!](https://intellij-support.jetbrains.com/hc/en-us/community/posts/360000168364-Pycharm-Virenv-AttributeError-module-pip-has-no-attribute-main-occured-)
C/C++ Apache Moduleのひな形ジェネレートの罠

Apache ModuleをC/C++で作ろうとして、罠にはまったので情報を残しておきます。

下記のコマンドでひな形をジェネレートすると思うのですが。
` /usr/sbin/apxs -g -n hello_world `

私は大文字・小文字を混ぜてジェネレートしました。
` /usr/sbin/apxs -g -n HelloWorld `

そうすると一字一句変わらぬhandlerが生成されます。

```cpp
/* The sample content handler */
static int HelloWorld_handler(request_rec *r)
{
    if (strcmp(r->handler, "HelloWorld")) {
        return DECLINED;
    }
    r->content_type = "text/html";      

    if (!r->header_only)
        ap_rputs("The sample page from mod_HelloWorld.c\n", r);
    return OK;
}
```

ビルド方法は他のサイトに紹介があるので割愛させていただきますが
調子よく「httpd.conf」にハンドラの呼び出しを書きます。

```
<Location /HelloWorld >
Order allow,deny
Allow from all
SetHandler HelloWorld
</Location>
```

あとは実行するだけなのですが、これが動かない。
原因として分かったのが、ここではねられる。

```cpp
    if (strcmp(r->handler, "HelloWorld")) {
        return DECLINED;
    }
```

「r->handler」に来る文字列がなんと、すべて小文字でした。

```cpp
    if (strcmp(r->handler, "helloworld")) {
        return DECLINED;
    }
```

これで動いた・・・
ジェネレートの時点で変換するか弾いて欲しいなって思いました。
yarnをインストールする

### 背景

jsのパッケージを管理できるパッケージマネージャです。

- github: https://github.com/yarnpkg/yarn

bowerを使っていましたがyarnに移行したときの備忘録です。

間違っているところがあれば、ご指摘ください。

### node.jsをインストール

https://nodejs.org/en/

### npmを確認

node.jsをインストールするとnpmが入っているはずなので以下のコマンドを実行する

```sh
# node.jsのバージョンを確認
node -v
# npmのバージョンを確認
npm -v
```

### yarnをインストール

```sh
# npm 経由でyarnをインストール
npm install -g yarn
# yarnのバージョンを確認
yarn -v
# yarnの初期設定
yarn init
# yarnでjqueryをインストールしてみる
yarn add --save jquery
```

パッケージのバージョン記載されている**package.json**が設置され、パッケージ自体は、デフォルトで**node_modules/**に設置される。

### おまけ1) パッケージのインストール先を変える

- .yarnrcをpackage.jsonと同じ階層に設置する
- --modules-folderでpathを設定する

```:.yarnrc
--modules-folder ./パッケージ設置したい場所
```

あとは、**yarn add** でパッケージをインストールするだけ


### おまけ2 非公開側と公開側でパッケージを分ける

タスクランナーなどは、公開領域に置きたくないということがあったので、package.jsonを二つに分けました。yarnのコマンドは各ディレクトリで実行するような感じになります。

> root/
> 　├ package.json  ← 非公開側のpackage.json
> 　├ node_modules/
> 　└ app/  ← 公開領域
> 　 　├ package.json  ← 公開側のpackage.json
> 　 　└　node_modules/
Cloud9からherokuへのpushを省略してみた

## 経緯
簡易的なウェブアプリを作成する中で、意外と[Cloud9](https://c9.io)から[Heroku](https://jp.heroku.com/home)へのpushが面倒だったので、Cloud9のbash上から呼び出しやすい用に1行でまとめてみた。
本格的な開発をしている訳ではないので、全ファイル一括で、コミットのコメントも`test`になっている等適当に設定されているためご注意を…。
詳しいGitコマンドは[【Git】基本コマンド
Git](https://qiita.com/konweb/items/621722f67fdd8f86a017)が分かりやすかった。

## 実行コマンド

```php
git add . && git commit -m "test" && git push heroku master
```
Toy-Neural-Network-JSでxor

#概要
Toy-Neural-Network-JSでxor問題やってみた。

#写真

![image.png](https://qiita-image-store.s3.amazonaws.com/0/18104/fa2dd1af-893a-77aa-53eb-27984fa2a244.png)


#サンプルコード


```
let nn;
let lr_slider;
let training_data = [{
    inputs: [0, 0],
    outputs: [0]
}, {
    inputs: [0, 1],
    outputs: [1]
}, {
    inputs: [1, 0],
    outputs: [1]
}, {
    inputs: [1, 1],
    outputs: [0]
}];
let sigmoid = new ActivationFunction(x => 1 / (1 + Math.exp(-x)), y => y * (1 - y));
function setup() {
    createCanvas(400, 400);
    nn = new NeuralNetwork(2, 4, 1);
    lr_slider = createSlider(0.01, 0.5, 0.1, 0.01);

}
function draw() {
    background(0);
    for (let i = 0; i < 10; i++) 
    {
        let data = random(training_data);
        nn.train(data.inputs, data.outputs);
    }
    nn.setLearningRate(lr_slider.value());
    let resolution = 10;
    let cols = width / resolution;
    let rows = height / resolution;
    for (let i = 0; i < cols; i++) 
    {
        for (let j = 0; j < rows; j++) 
        {
            let x1 = i / cols;
            let x2 = j / rows;
            let inputs = [x1, x2];
            let y = nn.predict(inputs);
            noStroke();
            fill(y * 255);
            rect(i * resolution, j * resolution, resolution, resolution);
        }
    }
}


```

#成果物

http://jsdo.it/ohisama1/gMpx


以上。
Excel から出力された汚い CSV を読み込むための定型文

Excel などからエクスポートした CSV は非常識なフォーマットであることが多く、Import-CSV を以ってしても読み込みに失敗することが少なくない。

そのような場合に、CSV 表のレイアウトが変更されていないかチェックしつつ、上手く読み込む方法をメモしておく。

```powershell
$organized_csv_data = cat .\chaotically_separated_values.csv |
    ForEach-Object -begin {
        $i = 0
    } -process {
        $i += 1

        # ヘッダのバリデーション
        if ($i -eq 1) { if ($_ -eq '$i 行目に想定される値') { return } else { throw "$i 行目が変更されています" } }
        # ... 必要なだけバリデーション行の繰り返し

        # 本来こうであって欲しいという CSV ヘッダ
        if ($i -eq $EndOfHeaderLines) {'問題なかった場合に生成するヘッダ'}

        # データ部分はそのままパイプに流す
        $_
    } | 
    Out-String |
    ConvertFrom-CSV
```

`cat` で csv を読み込むと文字列の配列になり `ConvertFrom-CSV` では上手く処理できないことがあるため、`Out-String` を挟んでいる。

Excel のまま vba でやったらでええやん、という意見もあると思うが、バッチ的に処理できるメリットは代えがたいものがある。

関数にするとこんな感じになると思う。

```powershell
Function Test-CSV {
    param(
        [scriptblock]$Expects,
        [scriptblock]$Headers
    )
    begin {
        $ExpectStrings = & $Expects
        $i = 0
        $len = $ExpectStrings.length
    }
    process {
        $i += 1
        $Actual = $_
        if ($i -le $len) {
            if ($ExpectStrings[$i-1] -eq $Actual) {
                return
            } else {
                throw "Format Error: line $i `nExpect: $($ExpectStrings[$i]) `nActual: $Actual"
            }
        } elseif ($i -eq $len+1) {
            & $Headers
            $Actual
        } else {
            $Actual
        }
    }
}

# 使い方
$csv_data = cat .\chaotically_separated_values.csv |
    Test-CSV -Expects {
        '一行目に期待する文字列'
        '二行目に期待する文字列'
        ...
    } -Headers {
        '列名1,列名2,...'
    } | 
    Out-String |
    ConvertFrom-CSV

```
bashで『先頭から特定行を除いたそれ以降のテキスト内容』を表示しようとしたけどawkがよくわかんなかった。


# やりたかったこと

ようするに、headコマンドの逆がやりたかった。

```bash
$ cat test.txt
     1  a
     2
     3  b
     4
     5  c
     6
     7  d
     8
     9  e
```

こういうテキストファイルがあったとして、例えば『先頭2行を切り抜く』なら

```bash
$ cat test.txt | head -n2
     1  a
     2
```
これでいいんだけど、これの逆、つまり **先頭2行を切り抜いたあとの残り** を表示したかった。
最初はなんかうまいことheadにそういうオプションとかないのかなとか、tailでなんかうまいことできないかなと思ったけど、うまくいかなかったので、awkでやってみることに。

awkで行単位で切り抜くなら、NR==${行番号} でawkスクリプトの評価式に指定してやればいい。

```bash
$ cat test.txt | awk 'NR==3'
     3  b
```

で、作りたい表示は

```bash
     3  b
     4
     5  c
     6
     7  d
     8
     9  e
```

なんだけど、意図としては『3行目以降のすべて』なので、なんかループとかさせたらいいのかな？って思ったら、なんかわかんないけどこれでいけた。

```bash
$ cat test.txt | awk 'NR==3,NR==0'
     3  b
     4
     5  c
     6
     7  d
     8
     9  e
```
評価式の二つ目に、以降を切り抜きたい行番号である3より若い数字を指定したら、なぜか最後まで出力された。そういう仕様なのかな。
ちなみに、3未満であれば上記同様、負の数字でも動作した。


```bash
$ cat test.txt | awk 'NR==3,NR==1'
     3  b
     4
     5  c
     6
     7  d
     8
     9  e
```

```bash
$ cat test.txt | awk 'NR==3,NR==-1'
     3  b
     4
     5  c
     6
     7  d
     8
     9  e
```

また、以下のような指定でも同様に動作した。

```bash
$ cat test.txt | awk 'NR==3,NR=0'
     3  b
     4
     5  c
     6
     7  d
     8
     9  e
```
※=を一つ減らす

```bash
$ cat test.txt | awk 'NR==3,NR0'
     3  b
     4
     5  c
     6
     7  d
     8
     9  e
```
※=を二つ減らす

```bash
$ cat test.txt | awk 'NR==3,N0'
     3  b
     4
     5  c
     6
     7  d
     8
     9  e
```
え、これでも動くの


```bash
$ cat test.txt | awk 'NR==3,0'
     3  b
     4
     5  c
     6
     7  d
     8
     9  e
```
もはやこの0の意味。。

ちなみにこの状態だと、

```bash
$ cat test.txt | awk 'NR==3,1'
     3  b
```
これはこうなる。1以外の数字でも同様。

# 結論

とりあえず、やりたかったこととしては、

```bash
$ cat test.txt | awk 'awk=={行番号},0'
```
で達成できたんだけど、なぜこれで意図したものが得られるのかわからないので、詳しい人に解説してほしい。。


# 環境

```
$ uname -r
4.9.85-37.55.amzn1.x86_64

$ awk --version
GNU Awk 3.1.7
```
2018年5月15日からRubotyでSlack連携が出来なくなる！？

## はじめに
実は先ほどまで自分は、Slack連携を行えるBot開発を行っていた(°▽°)...
普段はRubyを書いているのでRubyで制御できるBotが良いなっと思い
なんだかんだでRubotyで開発作業を進める事にしていた...がしかし
Slackはゲートウェイへのサポートを終了することを知るのであった( ﾟДﾟ)ﾊｯ!?

## サービス終了の詳細情報

<img width="889" alt="スクリーンショット 2018-04-21 1.43.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/195292/e77863d6-a0a3-0a5a-53ec-3e4f968856c6.png">

結論から言うと
**2018年5月15日** からゲートウェイが使えなくなり、これまでそこを通して動かしていたRubotyが動かせなくなってしまうのである(´；ω；｀)
(もちろんココを通して使ってたモノも諸々使えなくなってしまう。。。)

※因みにこのSlackのサービス終了内容は[こちら](https://doppons-timecard.slack.com/account/gateways)から見れます。

## じゃあどうすれば良いのか(とか言いながらただの感想)
Slack側としてはRubotyとかではなくSlackが公式に提供してるAPIの方を使ってBot開発をして欲しいのでは?[RTM←](https://api.slack.com/rtm)とか(´・ω・｀)ｗ


## おまけ
自分がrubotyの記事とかを見たときにこう言った情報がなくこの事に気づくのが遅くなったので、何かのお役に立てればと思います >人<なむなむ
因みにRubotyってなんじゃ( ﾟДﾟ)ﾊｯ!?
って方には以下の記事とか参考になるかもです。

- [Ruboty って何？どうやって動かすの？ Hubot と何が違うの？どっちを使えばいいの？](https://qiita.com/tbpgr/items/39d93a0a33ec99e37da1)
- [Ruby製HubotクローンのRubotyをSlackで動かす](https://qiita.com/r7kamura/items/8d1b98e28154de6030b90)
テスト環境用にクローズドなIPFSノードを立ち上げる方法

DApps開発において、データやファイルをどこに格納するのかは常に課題になると思いますが、
現段階でその課題を解決してくれそうな一番の有力候補はIPFSでしょう。

そこで今回はIPFSを使うために、テスト環境用にクローズドなIPFSノードを立ち上げる方法を試してみようと思います。

## 1. go-ipfsのダウンロード
下記サイトよりgo-ipfsをダウンロードし、任意の場所に格納します。
https://dist.ipfs.io/#go-ipfs

## 2. インストール
下記のinstall手順に沿って、コマンドを実行し、ipfsをインストールします。

```bash
tar xvfz go-ipfs.tar.gz
cd go-ipfs
./install.sh
# Moved ./ipfs to /usr/local/bin
```

`ipfs help`とコマンドを打って、helpが表示されていれば無事ダウンロード完了です。

## 3. 起動(パブリック)
下記コマンドを実行すると、IPFSノードがパブリックな状態で起動します。

```bash
ipfs daemon
# Initializing daemon...
# Successfully raised file descriptor limit to 2048.
# Swarm not listening, running in offline mode.
# API server listening on /ip4/127.0.0.1/tcp/5001
# Gateway (readonly) server listening on /ip4/0.0.0.0/tcp/9001
# Daemon is ready
```

問題なく起動できていれば、下記コマンドで自分が立ち上げたノードと接続されたpeerを確認できます。

```bash
ipfs swarm peers
```

問題なくパブリックなネットワークに接続できているか確認するため、下記のコマンドで猫の画像を取得してみます。

```bash
ipfs cat /ipfs/QmW2WQi7j6c7UgJTarActp7tDNikE4B2qXtFCfLPdsgaTQ/cat.jpg >cat.jpg
open cat.jpg
```

猫の画像が見えれば、ノードの起動は成功です。

![cat.jpg](https://qiita-image-store.s3.amazonaws.com/0/92492/8b84e7bf-738f-a9fc-a867-ff286ba41afe.jpeg)



## 4.起動(クローズド)
`ctrl + c`で起動させたノードを停止し、下記コマンドでIPFSノードをクローズドな状態で起動します。

```bash
ipfs daemon --offline
# Initializing daemon...
# Successfully raised file descriptor limit to 2048.
# Swarm not listening, running in offline mode.
# API server listening on /ip4/127.0.0.1/tcp/5001
# Gateway (readonly) server listening on /ip4/0.0.0.0/tcp/9001
# Daemon is ready
```

問題なく起動できていれば、下記コマンドでエラーになります。

```bash
ipfs swarm peers
# Error: This command must be run in online mode. Try running 'ipfs daemon' first.
```

## 5.ファイルのアップロード
クローズドなIPFSノードにファイルをアップロードします。

```bash
ipfs add sample.png 
# added Qmxxxxxxxxxxxxxxxxxxxxxxxxxxx sample.png
```

ハッシュ値が返ってくるので、その値をもとにIPFS自身が運営するGatewayと自分で立ち上げたノードとにアクセスしてみます。

- IPFS Gateway
  - https://ipfs.io/ipfs/Qmxxxxxxxxxxxxxxxxxxxxxxxxxxx

- 自分で立ち上げたノード
  - http://localhost:8080/ipfs/Qmxxxxxxxxxxxxxxxxxxxxxxxxxxx

自分で立ち上げたノードでのみ画像が表示されていると思います。
ファイルをアップロードした後に、IPFSノードをパブリックな状態で起動し直してしまうと、他のパブリックなノードからアクセスできてしまうので要注意です。

## 6.設定変更
ポートを変更したい場合は、下記コマンドで変更できます。

```bash
ipfs config Addresses.Gateway /ip4/0.0.0.0/tcp/9001
ipfs config Addresses.API /ip4/0.0.0.0/tcp/3001
```

異なるドメインからIPFSのAPIを呼ぶ場合は、下記コマンドでHTTPHeadersの設定を変更しておく必要があります。

```bash
ipfs config --json API.HTTPHeaders.Access-Control-Allow-Origin '["*"]'
ipfs config --json API.HTTPHeaders.Access-Control-Allow-Methods '["GET", "POST"]'
```




---
<参考>
https://ipfs.io/docs/
https://groups.google.com/forum/#!topic/ipfs-users/5oEfULoGpt4
Chromebookでmbed使ってBLE nano v2でLチカ

# 概要
下記サイトを参考にBLE nano v2でLチカしようと思ったら、動かなかったので、いろいろためした。
書き込み基板DAPLinkのfirmwareを適切なやつにしたら動いた。
[クラゲのIoTテクノロジー](http://jellyware.jp/kurage/blenano/blenano2_start.html)

# 用意したもの
- Chromebook
- BLE Nano v2.0
- DAPLink v1.0

![IMG_0996.jpg](https://qiita-image-store.s3.amazonaws.com/0/184221/1aa15454-2c94-3ba0-b66e-c618c7aa85c0.jpeg)

裏のシルクでバージョン確認。
![IMG_0998.jpg](https://qiita-image-store.s3.amazonaws.com/0/184221/a0aff80e-5f27-ead8-4bbd-14bb87b3fc07.jpeg)

# したこと
## firmwareの更新
結局しなくてもよかったのかもしれん。
バージョンに合わせて下記firmwareを書き込んだ。
クラゲのIoTテクノロジーに沿ってやってみたら、v1.5のを書き込んじゃって、動かなかった。壊れたかと思った。バージョン確認大事。
DAPLink_V1.0_Interface_nRF52.bin	
[nRF5x/nRF52832/daplink at master · redbear/nRF5x · GitHub](https://github.com/redbear/nRF5x/tree/master/nRF52832/daplink)

## mbedでコンパイル
基板上のLEDをチカチカさせる。
コピペでソースコード貼っつけて、mbed.hのライブラリ？はコンパイルしたら、ないよって言われたので、ポチポチして選んだ。
[Development Platform for Devices | Mbed](https://os.mbed.com/)
![Mbed Compiler  L chika main cpp.png](https://qiita-image-store.s3.amazonaws.com/0/184221/091a990b-c32b-c3f6-f927-3b0a9c40070b.png)

PlatformはNordic nRF52-DKってのを選択した。
[nRF5x/Mbed_IDE_User_Guide.md at master · redbear/nRF5x · GitHub](https://github.com/redbear/nRF5x/blob/master/nRF52832/docs/Mbed_IDE_User_Guide.md)

## ボタン電池で駆動
VDDに＋、GNDにーをつなぐだけ。
![IMG_1001 (1).JPG](https://qiita-image-store.s3.amazonaws.com/0/184221/04f0cb01-eadc-81b6-4acf-86ea3d51496a.jpeg)


## おわりに
おもったより時間かかった。
バージョン確認大事。
BLE nano手軽。
mbed手軽。
Arduino派やったけど、Chromebookですなおに使えたのでmbedに鞍替えしようかなと思った。
Windowsの「ファイル名を指定して実行」でエクスプローラーを格好良く使いたい

「ファイル名を指定して実行」で格好良く、特定のディレクトリでエクスプローラーを開く方法をシェアします。ここでいう特定のディレクトリとは、例えば、高頻度で使用するフォルダを指します。 

このハックは、とある先輩から教えていただいたものです。ご教示ありがとうございました!

## はじめに

「ファイル名を指定して実行」とは、 `Windows` キーを押しながら `R` キーを打鍵することで表示されるダイアログ (何かしらの入力を受け付けてくれる小窓) です。これは主に、キーボード入力のみでプログラムを立ち上げる用途で使われます。

エクスプローラーとは、 `Windows` キーを押しながら `E` キーを打鍵することで表示される窓です。これは主に、ファイルおよびフォルダを管理する用途で使われます。

また、以下の2つを満たすことで、エクスプローラーを格好良く使えたとします。

- カーソル操作なしに特定のディレクトリでエクスプローラーを開くこと
- 上記を行うために、実行時間をかけないこと


## 何するの?

「ファイルを指定して実行」からリンクを叩くことにより、特定のディレクトリでエクスプローラーを開きます。

つまり、こうすると、
![fig1.JPG](https://qiita-image-store.s3.amazonaws.com/0/239182/2334f1f8-80f5-8cda-94fc-7fce8068c7fb.jpeg)

こうなります。
![fig4.JPG](https://qiita-image-store.s3.amazonaws.com/0/239182/8ad60906-a70a-12be-d3ed-d1821878c0cc.jpeg)

ちゃんと説明しますと、「ファイルを指定して実行」から `stua` と命名したリンクを叩くことによって、`C:\Users\...\2018\saving-the-universe-again` のフォルダに、短時間でアクセスしました。


## 設定手順は?

前章のテクニックが実現できるまでの操作手順を示します。なお、括弧の中に示す内容は、必要に応じて行うべき操作です。

1. リンク集のフォルダを作成する (+ そのフォルダへパスを通す)
2. 特定のディレクトリにアクセスするためのリンクを作成する (+ リンク名を変更する)
3. リンクをリンク集のフォルダに移動させる


## 具体的にどう設定する?

スクリーンショットを交えながら、設定手順を説明します。

### 1. リンク集のフォルダを作成する (+ そのフォルダへパスを通す)

以降の手順では、ユーザー直下に自動的に生成する `Links` ( もしくは `links` ) を、リンク集のフォルダとして利用します。もちろん、リンク集のフォルダとして、新たにフォルダを作成してもらって構いません。

`Links` にパスを通します。

![fig10.JPG](https://qiita-image-store.s3.amazonaws.com/0/239182/4c0c09cb-7d08-35d3-3fa4-bea40ae1710e.jpeg)


### 2. 特定のディレクトリにアクセスするためのリンクを作成する (+ リンク名を変更する)

続いて、高頻度で使用するフォルダのリンクを作成します。ここでは、`saving-the-universe-again` のリンクを作成しています。
![fig6.JPG](https://qiita-image-store.s3.amazonaws.com/0/239182/15f30019-09f5-b7a5-45ba-8e1b1298722b.jpeg)

必要であれば、「ファイルを指定して実行」時に打鍵する文字数を減らすために、リンク名を変更します。ここでは、`saving-the-universe-again` → `stua` としています。
![fig8.JPG](https://qiita-image-store.s3.amazonaws.com/0/239182/a4942075-3eab-3b42-0e24-17d0f48da72b.jpeg)


### 3. リンクをリンク集のフォルダに移動させる

そして最後、先ほどの `stua` を、パスの通ったリンク集のフォルダ直下に移動させます。
![fig3.JPG](https://qiita-image-store.s3.amazonaws.com/0/239182/03735bd0-a6b2-0476-8d3e-4e74d446576b.jpeg)

これで準備は終わりです。お疲れ様でした。

## まとめ

この記事では、「ファイル名を指定して実行」で格好良く、特定のディレクトリでエクスプローラーを開く方法を示しました。あらゆるWindowsユーザーにとって、重宝するテクニックだと信じています。ぜひ習得してください!

最後に、この記事が、皆さんの快適な業務の一助となれば幸いです。


## 参考
[探したいフォルダに1秒でたどり着ける爆速ショートカット](https://qiita.com/little_hand_s/items/46936d9e8cb0a82fa6c0): 先達です。書いてから記事の存在に気づきました...
[「ファイル名を指定して実行」で、よく使うやつ](https://qiita.com/usop4/items/389ee355625641486d98): この記事で示したこと以外の、「ファイル名を指定して実行」の便利な用途を紹介しています。


## 余談1: デスクトップにリンクを貼れば済む話ではないのか?

それで済むなら良いと思います。デスクトップにリンクを貼る手段によっても、特定のディレクトリでエクスプローラーを開くことができます。

しかし、自分は、デスクトップを最前面に持ってきてリンクを叩くこと、そしてリンクを叩くために途中でカーソル操作に移行することは煩わしいと感じます。つまり、この手段は自分の肌に合ってません。

そのため、カーソル操作なしに、同等の成果を実現できないかと考えていました。


## 余談2: リンク作れば何でもいける?

はい、「ファイル名を指定して実行」は、わりと多くのリンクを受け付けてくれるようです。実行ファイルのリンクでも、Webページのリンクでも「ファイル名を指定して実行」で叩くことができました。

この例として、[Qiitaのtrend](https://qiita.com/trend)へのリンクを作成し、一通りの設定をしておくと、ブラウザのホーム画面を見ることなく、[Qiitaのtrend](https://qiita.com/trend)にアクセスすることができます。(しかし、お気に入りからアクセスする場合と比べ、手間がかかっている気がします。)
Visual Studio CommunityでAndroid-SDK入ったと思ったら

visual studio Macの中に、 Android-SDKがあり、既にCordovaをインストールしていたことを忘れていたので、直ぐに Androidのアプリ開発ができると思ったのです。

今回、cordovaでプロジェクトを作りビルドしてみました。

今回cordovaの開発で参考にしたサイトは、こちらです。
https://codezine.jp/article/detail/9327

http://www.atmarkit.co.jp/ait/articles/1709/04/news015.html

そして Androidのadbにパスが通っていないことが分かりました。
参考にした記事
https://qiita.com/nbkn/items/01a11392921119fa0153

https://gabekore.org/mac-path-environmental-variable

Visualstudio Mac版のAndroid-SDKは深いところにあります。
そして、このPATHの最後に、platform-toolsをつけることを、下記の記事で閃きました。
https://qiita.com/piyonakajima/items/32cbd82f4b3c7e30e6ae

私は、PATHの記述が初めてだったので、初期の内容を消してしまい、cordovaのコマンドもviも動かなくなってしまい、焦りました。
このサイトを見て、初期のPATHを確認できたので、助かりました。
http://shotn.hatenablog.com/entry/20171112/1510489350

今回は、onsen-UIも、npmを使いインストールしました。
Visualstudioでcordovaを使ってアプリを作るとき、プラグインの修正をしたくてもフォルダーを見つけることができないので、止むを得ずターミナルを使ってアプリを作る環境も作りました。
【Python】pip installしたパッケージの一括アップグレード

# 目的

pip installしたパッケージを一括アップグレードしたい。

# 方法

コマンドプロンプトでもなんでもいいので、以下のワンライナーを実行してください。
環境によっては管理者権限で実行する必要があります。

```bash
$ python -c "import sys;from subprocess import call,check_output;p=[sys.executable,'-m','pip'];[call(p+['install','-U',n.split('=')[0]])for n in['pip']+check_output(p+['freeze']).decode().splitlines()]"
```

# 補足

パッケージ間の依存関係を無視して一括アップグレードするので、依存関係が壊れる可能性があります。
アップグレード後は念の為、依存関係が破損していないかチェックしておきましょう。

```bash
$ python -m pip check
```

問題がなければ `No broken requirements found.` と出力されます。
問題があった場合は以下のコマンドで修正できる場合もあります。

```bash
$ python -c "import sys;import subprocess as s;p=[sys.executable,'-m','pip'];[s.call(p+['install',n[:-1]])for n in s.Popen(p+['check'],stdout=s.PIPE).stdout.read().decode().split()if n[-1]==',']"
```
React Native for Webでコンポーネントを書いていく

以前の記事では、React Native for Web (RN Web)とは何ぞや、という紹介をしました。

[React Native for WebでHello world](https://qiita.com/nacam403/items/7c48f1163646887b11fb)

今回は次の一歩として、RN Webで具体的にコンポーネントを書き始めるための基礎を紹介します。

# 基本は公式のStorybook。が、

[RN Web公式のStorybook](https://necolas.github.io/react-native-web/docs)があり、ここにRN Webでの原子的な材料となるコンポーネントが載っています。View、Text、Imageなど。
これらを組み合わせて、自作のコンポーネントを書いていくのが基本となります。

・・・なのですが、実は、RNに標準で用意されている全コンポーネントがRN Webに移植されているわけではないんです。
[RNのドキュメント](https://facebook.github.io/react-native/docs/getting-started.html)をRN WebのStorybookと見比べると分かりますが、RNにはあってRN Webにないものがちょこちょこあります。
そうしたRNにしかないコンポーネントを使っていた場合、RN Webにおいては適当な仮実装（ただのViewなど）に置き換えられます。ちゃんと移植はされていないものの、エラーが起こったりはせずに一応は動くようになっています。

## 必要に応じてWeb固有部分を書く

そうした事情もあり、iOS/Android/Webのプラットフォーム3本立てのアプリを作るには、現実的にはプラットフォームに応じて多少の分岐が必要になるでしょう。
分岐の作り方はRNがもともと備えている仕組みと同じ要領であり、以下の2通りがあります（RN Web公式の説明は[こちら](https://github.com/necolas/react-native-web/blob/master/website/guides/getting-started.md#web-specific-code)）。

- ファイル内での小さな分岐: `Platform`モジュールを使う。
- ファイル単位の分岐: RNにおいて拡張子を`.ios.js`、`.android.js`とするのと同じ要領で、`.web.js`とする。

一つ目の`Platform`は簡単です。`Platform.OS`の値が、iOSなら`ios`、Androidなら`android`になるところが、RN Webだと`web`になります。
この値を参照して、ちょっとした分岐を書けるでしょう。

二つ目のファイル単位の分岐を利用するには、まずWebpackの設定に少し書き足す必要があります。以下の通りです。

```webpack.config.js
module.exports = {
  // 前略（entry, output, moduleなど）

  resolve: {
    extensions: [ '.web.js', '.js' ] // .web.js がポイント
  }
}
```

この様にした上で、あるコンポーネントMyComponent.jsに関し、iOS/Android用とは異なる実装としたWeb用のMyComponent.web.jsを別途用意したとします。

MyComponentを使いたいコンポーネントでは、以下の様にimportします。

```jsx
import MyComponent from './MyComponent'
```

こうすると、iOS/AndroidではMyComponent.jsの内容が使われ、RN WebではMyComponent.web.jsの内容が使われます。

# ルーティングはどうするか

本格的なアプリを作るには、たいてい何らかのルーティングが必要になってきます。
代表的なルーティングライブラリの一つであるReact Routerは、Web用（本家本元のReact用）の`react-router-dom`と、RN用の`react-router-native`の両方が用意されていて、概ね共通のAPIが提供されています。なんとなくRNとRN Webの関係に似ていますね。

試してみたところ、RN WebではこのReact Routerが使えました（他にも使えるルーティングライブラリはありそうですが、調べられていません）。
では、RN Webではどっち用のReact Routerを使うの？という話になりますが、Web用（`react-router-dom`）を使ってみたところ、無事動きました。
RN Webはブラウザ上で動かすものですから、基本的にはReact用のライブラリが使えるということでしょうか。

というわけで、RNでは`react-router-native`を、RN Webでは`react-router-dom`をimportして使いたいので、先ほど紹介したプラットフォーム毎に分岐させるパターンをさっそく利用して、2種類のReact Routerを使い分けることになるでしょう。

# RN用のコンポーネントライブラリは使えるか

巷にある、RN用のおしゃれコンポーネントライブラリって色々ありますよね。
これらのライブラリがRN Webでも使えるかどうかは、そのライブラリが何に依存しているかによります。
iOSやAndroidのネイティブの部分に依存しているライブラリは、RN Webでは使えないと思ってよいでしょう。

一方、RN標準のコンポーネントの組み合わせで実現しているライブラリならば、RN Webでも使えます・・・多分。
多分の理由は、先述の通り、RN標準のコンポーネント全てがRN Webに移植されているわけではないからです。
Google Colaboratoryをイジメるよ

# 目的
Google Colaboratoryのメモリ上限を探る

# コード
```python:
import time
import numpy as np
from itertools import product
import sys

now = time.time()

for l in [101,1001,11001]:
  a = np.linspace(0,1,l)
  b = np.linspace(1,2,l)
  c = np.array(list(product(a,b)))
  elapsed_time = time.time() - now
  print(f"経過時間：{elapsed_time}")
  print("MB:",sys.getsizeof(c)/1000000)

```

# 実行結果
```
経過時間：0.07169699668884277
MB: 0.163328
経過時間：0.6292345523834229
MB: 16.032128
経過時間：65.04300308227539
MB: 1936.352128
```

# 考察
2GB越えるとダメっぽい
「qiita items」をgoogleで開く近道

googleで、「qiit item」「I'm Feeling Lucky」
4文字4文字で表示します。
ブラウザのお気に入りに登録すれば済む話でした。
#教えて下さい。
http://www.k-techlabo.org/www_python/python_modules.pdf
上記を,googleの「I'm Feeling Lucky」で表示する方法があれば教えて下さい。pdfは、無理ですか。

googleの「qiita python テキスト pdf」「I'm Feeling Lucky」では、表示されませんでした。
以下を表示します。
(タイトル)Pythonのテキスト作りました
https://qiita.com/KatsunoriNakamura/items/b465b0cf05b1b7fd4975
GCPでやねうら王を使う

# GCPでのインスタンス作成

![gcp1.png](https://qiita-image-store.s3.amazonaws.com/0/133885/97f2d20e-7e45-ca69-83e8-5eabd995e546.png)

ビルドが簡単にできるDebianを使います。マシンタイプはご予算に応じて。

![gcp2.png](https://qiita-image-store.s3.amazonaws.com/0/133885/969770f4-6839-fe09-a71d-973bb8b76289.png)

ssh鍵の登録もインスタンス作成時に行うと楽。
鍵の生成はこちらhttps://qiita.com/tibigame/items/0941991a1764f5fed4b1
同等の[REST]と[コマンドライン]と書いてある所を押すとgcloudコマンドからインスタンス作成できるコマンドが表示される。
同じインスタンスを作りたい場合はそのコマンドを叩けばいい。
GCPは楽でいい。

# やねうら王をビルドしよう

```bash
sudo apt update
sudo apt install -y git clang make wget unzip
git clone https://github.com/yaneurao/YaneuraOu.git
cd YaneuraOu/source/
# makeの微修正
sed -i '/march=native/ s/# //' ./Makefile
make
mkdir ~/bin && cp ./YaneuraOu-by-gcc ~/bin && cd ~/bin &&
# 評価関数をダウンロードする
wget https://github.com/qhapaq-49/qhapaq-bin/releases/download/eloqhappa/eloqhappa1_1.zip
unzip eloqhappa1_1.zip && rm eloqhappa1_1.zip && mv elq-0521 eval
```

YaneuraOu-by-gccコマンドを叩いてusiやisreadyが正常に動けばOKだ。
サービスから通知を送信してみる。

#概要
今回から備忘録として、Androidアプリの開発に使えるものを書いていきたいと思います。
今回は、通知を送信してみたいと思います。
##通知を送信する

```Java
 Intent i = new Intent(Service.this, MainActivity.class);
            PendingIntent pendingIntent
                    = PendingIntent.getActivity(
                    this,
                    0,
                    i,
                    0);
                Notification notification = new Notification.Builder(this)
                        .setContentTitle("通知")
                        .setContentText("テスト通知です！！")
                        .setContentIntent(pendingIntent)
                        .setSmallIcon(R.drawable.img)
                        .setAutoCancel(true)
                        .build();
                NotificationManager nm = (NotificationManager)
                        getSystemService(Context.NOTIFICATION_SERVICE);

nm.notify(1000, notification);

```

簡単に説明します。

```Java
 Intent i = new Intent(Service.this, MainActivity.class);
```

まず、最初の一行目は、Intentの定義です。
右にどこに飛ばすか、左に何処から飛ばすかを書きます。

```Java
PendingIntent pendingIntent
                    = PendingIntent.getActivity(
                    this,
                    0,
                    i,
                    0);
```

次は、Intentの引数の設定です。
thisはContext
0はRequestCodeと言って、簡単に言うと通知につけるそれぞれの番号です。
別の内容のものとかぶるといろいろ面倒くさいので、別々ものを付けておくことをお勧めします。
iは先程定義した、Intentを入れています。
今度の0はFlagです。機会があったら、詳しく説明します。

```Java
Notification notification = new Notification.Builder(this)
                        .setContentTitle("通知")
                        .setContentText("テスト通知です！！")
                        .setContentIntent(pendingIntent)
                        .setSmallIcon(R.drawable.img)
                        .setAutoCancel(true)
                        .build();
```

これは、通知の設定です。
setContentTitleは通知のタイトル
setContentTextは通知の内容。
setContentIntentは先程設定した、Intentです。
setSmallIconは通知アイコンです。
あまり複雑なものは指定できないので、簡単なものを指定しましょう。
setAutoCancelはタップした時に通知を自動で消すかです。

```Java
    NotificationManager nm = (NotificationManager)
                        getSystemService(Context.NOTIFICATION_SERVICE);

nm.notify(1000, notification);
```

これは先程の物をすべて詰め込んで、通知を送信するところです。
1000というのは通知番号です。
これをそれぞれ設定すると、通知が送信されるはずです。
参考にしてみてください。

[参考サイト](https://developer.android.com/guide/topics/ui/notifiers/notifications.html?hl=ja)
Galaxy S4にカスタムOS を導入③

皆さんこんちは今回はGalaxy S4にカスタムOS を導入する続きを解説したいと思います。

 

#Google製初期アプリのインストール

カスタムOSをインストールしただけではGooglePlay がないため、アプリのインストールができません。

Google製アプリをインストールしていきます。

まず、[ここ](https://www.theandroidsoul.com/download-dynamic-gapps-nougat/)からGoogle製アプリがまとまったものをダウンロードしてください。
基本的にはMiniで大丈夫です。

そして、前回のOSのインストールと同じようにインストールしてください。

そして起動すれば完了です。
#まとめ

いかがでしたか？

これでカスタムOSのインストールは完了です。

残念ながらこの端末の場合カメラとマイクが使えませんでした。

端末によっては使えない機能があるのが残念ですが、バージョンが新しかったりいろいろな機能があるので、古い端末を有効活用できそうです。

以上カスタムOSのインストールでした。
Galaxy S4にカスタムOS を導入②

皆さんこんにちは！
今日は前回のインストールの続きをやっていきたいと思います！

#OSのダウンロード

まず、OSをダウンロードしていきます。

[こちら](https://download.lineageos.org/jfltexx)(これはgalaxy用です。ご自身の端末のあったものを選択して下さい。)
から最新バージョンのものをダウンロードしてください。

（アプデするときにダウンロードしに来るので、ブックマークしておくとよいですよ！）

そして、エクスプローラーを使って「.zip」のままスマートフォンへコピーします。

 
#OSのインストール

前回インストールしたTWRPを起動して下さい。

次に一番上の「Install」を押してください。

次に自分がダウンロードした「zip」ファイルを選択して下さい。

そして「Swipe to　Confine flash」をスワイプしてください。

待って完了画面が表示されたら、インストール完了です。

でも、まだここで起動しないでください。

このまま次の記事へ進んでください。
MySQL エラーメモ

#SQLSTATEエラー
.envでデータベースを変更したのにも関わらず、
```
"SQLSTATE[HY000] [1045] Access denied for user 'homestead'@'localhost' (using password: YES) (SQL: select count(*) as aggregate from `users` where `email` = amno ▶"
```
""となったとき、

```
php artisan config:clear
```
をすれば、治る。
Galaxy S4にカスタムOS を導入①

#きっかけ

Root化に失敗し、サムスンの画面から進まなくなってしまいました。

そこで、カスタムOSを導入しなおしたいと思ったからです！
#今回やること

まず、カスタムOSを導入するための準備をしたいと思います！
#方法

まず、こちらからOdinというソフトをダウンロードしてください。

次に、TWRPというソフトを導入するためのファイルをこちらからダウンロードしてください。

スマホをパソコンに接続します。

そして、ダウンロードモードにするため

「音量を下げるボタン」と、「ホームボタン」、「電源ボタン」を同時に押して

警告画面が出たらインストールするボタンを押してください。

downloadモードになったらOdinを起動してください。


APというところを選択して歳ほどdownloadしたTWRPというソフトのファイルを選択してください。

そしてスタートというところを押してください。

完了したら、スマホの電源をいったん切ってください。

そして今度はリカバリーモードにするため

「音量をあげるボタン」と、「ホームボタン」、「電源ボタン」を同時に押して

TWRPが起動出来たら完了です。

次回はカスタムOSをインストールしていきます。

※追記　最初はCyanogenModをインストールしたのですが、セキュリティの問題で、lineageosに変更しました。
Vimでスワイプしたい

#はじめに
[iVim](https://github.com/terrychou/iVim)を使っているとスワイプでスクロールしたくなります。
指を2本使えばホイール相当の動きをしますが、スマホなら1本指でやりたいものです。
探してみると、マークのおもしろい使い方を見つけたので共有しておきます。
#スクリプト
```vim
function! Swipe()
	"mark b is the current cursor position
	"mark a is the previous cursor position
	normal mb
	let currPos=line('.')
	normal `a
	let prevPos=line('.')
	if currPos>prevPos
		normal `bma
		execute "normal! \<C-e>"
	elseif currPos<prevPos
		normal `bma
		execute "normal! \<C-y>"
	endif
endfunction

map <silent> <LeftDrag> ma<LeftMouse>:call Swipe()<CR>
```
#解説
ほとんど参考そのままです。
ドラッグすると最初の位置をマーク(ma)した後\<LeftMouse>を呼びます。
\<LeftMouse>のデフォルト動作はカーソル移動なので、カーソルのある位置をマークできます(mb)。
最後に2つの行数を比べてスクロールします。
#参考
+ https://vi.stackexchange.com/questions/11126/can-i-scroll-in-vim-with-my-touch-screen
+ http://d.hatena.ne.jp/osyo-manga/20140320/1395327444
Wear OS（Android Wear）スマートウォッチと加速度センサ

Wear OSの加速度センサがどちらに向いてるのか忘れてしまうので、備忘録。

スマートウォッチは「TicWatch E」


<img width="206" alt="ウェアラブル加速度向き.png" src="https://qiita-image-store.s3.amazonaws.com/0/142423/a3d77645-a1d7-171a-c939-c2180fb96cd6.png">



向きそれぞれの加速度データ。
ちょっと見づらいですが、気にしない方向で。


机の上に普通に置いたとき
<img width="223" alt="スクリーンショット 2018-04-20 22.34.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/142423/e55a1f66-670a-6c70-8511-b366aa25e0b7.png">

机に側面をつけたとき
<img width="503" alt="スクリーンショット 2018-04-20 22.35.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/142423/778fd6d0-be81-1195-4f4b-32475aa7d472.png">

机の上で持ったとき
<img width="249" alt="スクリーンショット 2018-04-20 22.35.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/142423/b3d21327-851f-7402-cf2b-732f39714a1e.png">
Laravel リレーション周りメモ

###AuthのIDが欲しい時
```php:hoge.controller.php
//絶対必要なトレイト
use Illuminate\Support\Facades\Auth;

// 現在認証されているユーザーの取得
$user = Auth::user();

// 現在認証されているユーザーのID取得
$id = Auth::id();
```
Goのjson.Unmarshalでネストした子のstructを切り替えて扱う方法

帰らなくてはならない時間ですが、時間をおいてしまうと忘れてしまうので、とっとと書いている chidakiyo です。こんばんは。

## 問題

ネストしたJSONで、子のstructのバリエーションが7パターンぐらいあるという問題に当たり、愚直にマッピングすると親7つと子7つを地道に実装することになります。
interface{}としてマッピングしてもよいのですが、ハンドリングがやたらややこしくなります。（めんどくさい）

JSONの構造的には具体的にはこんな感じ

```json
[
  {
    "ID":1,
    "Name":"A",
    "Child":[
      { // この子要素のフィールドがtypeにより可変
        "Desc1":"d1",
        "Desc2":"d2",
        "Type":1}]
      },
  {
    "ID":2,
    "Name":"B",
    "Child":[]
  }
]
```

親要素の中に子要素があり、子要素が持っているtypeで7パターンの構造体を振り分ける、のようなイメージです。

## Childのフィールドをstructやinterfaceでマッピングしなければ良いじゃない

というわけで、 `Child` のフィールドはマッピングしなければ良いじゃない、というわけで string 型にしてみます。

struct的にはこんな感じですね

```golang
type Hoge struct {
    ID int64
    Name string
    Child string
}
```

コードはこんな感じ

```golang
type Hoge struct {
    ID int64
    Name string
    Child string
}

var jbyte = []byte(`[{"ID":1,"Name":"A","Child":[{"Desc1":"d1","Desc2":"d2","Type":1}]},{"ID":2,"Name":"B","Child":[]}]`)

s := &[]Hoge{}
if err := json.Unmarshal(jbyte, s);  err != nil {
    t.Fatalf("errorだよ %s", err.Error())
}
```

これを実行すると。。。

```
json: cannot unmarshal array into Go struct field Hoge.Child of type string
```

という感じに怒られます。。。
こまった。

## 正解は[]byteにマッピングすれば良い

題の通り。

ちょうど、jsonパッケージに `json.RawMessage` というのがあります。

実装は

```golang
// RawMessage is a raw encoded JSON value.
// It implements Marshaler and Unmarshaler and can
// be used to delay JSON decoding or precompute a JSON encoding.
type RawMessage []byte
```

こんな感じなので []byte ですね。

で、先程のコードを以下のように修正します。

```golang
type Hoge struct {
    ID int64
    Name string
    Child json.RawMessage
}

var jbyte = []byte(`[{"ID":1,"Name":"A","Child":[{"Desc1":"d1","Desc2":"d2","Type":1}]},{"ID":2,"Name":"B","Child":[]}]`)

s := &[]Hoge{}
if err := json.Unmarshal(jbyte, s);  err != nil {
    t.Fatalf("errorだよ %s", err.Error())
}

t.Logf("%v\n", string((*s)[0].Child))
```

を実行すると

```json
[{"Desc1":"d1","Desc2":"d2","Type":1}]
```

となりいい感じですね。

## 最初にあった謎の要件を満たす。

要件は
*親要素の中に子要素があり、子要素が持っているtypeで7パターンの構造体を振り分ける*

という感じなので、子要素のtypeを判別する必要があります。
子要素のtypeはすべての子要素が共通して持つので

```golang
type TypeOnly struct {
    Type int64
}
```

のように実装できます。

先程のコードにtype判別のための実装を含めると

```golang
type Hoge struct {
    ID int64
    Name string
    Child json.RawMessage
}

var jbyte = []byte(`[{"ID":1,"Name":"A","Child":[{"Desc1":"d1","Desc2":"d2","Type":1}]},{"ID":2,"Name":"B","Child":[]}]`)

s := &[]Hoge{}
if err := json.Unmarshal(jbyte, s);  err != nil {
    t.Fatalf("errorだよ %s", err.Error())
}

brunch := (*s)[0].Child

ss := &[]TypeOnly{}
if err := json.Unmarshal(brunch, ss) ; err != nil {
    t.Fatalf("やっぱりerrorだねぇ。。。。 %s", err.Error())
}

t.Logf("%v\n", (*ss)[0].Type)
```

のような感じで実装すればログに `1` と出力され、typeが判別できます。

あとはこれをswitch文なりで分岐して、brunchの[]byteをそれぞれの構造体を実装しUnmarshalすれば良いと思います。
（最後はだいぶ手抜き）

## さいごに

手元のちょっとした作業の検証用に使ったコードをQiita用に書き換えたので動かないなどあればコメント下さい
ログローテ用のリソース取得スクリプト(top)

こんにちは。

/etc/cron.dを使って定期的にリソース取得し、ローテーションも行えるようにスクリプトを組んでみました。簡単ですが、top -Hを使ったことがなかったので備忘録として記事にしておきます。

##【スクリプトの説明】
まず/var/log傘下にprocessディレクトリを作成しておきます。

```BASH:mkdirで作成
mkdir /var/log/process
```
そして/usr/local/bin/にprocessというファイルをviで新規作成し、以下のスクリプトを組みます。

```BASH:/usr/local/bin/process
#!/bin/bash

### 設定値
GENERATION=7
PROCDIR=/var/log/process

### フォルダ作成
DATE=`date "+%Y%m%d"`
if [ ! -d $PROCDIR/$DATE ] ; then
 mkdir $PROCDIR/$DATE > /dev/null
fi

### topをスレッド分まで取得しておくこと
top -b -H -n 1 | awk '{print strftime("%Y/%m/%d %H:%M:%S"), $0}' >> $PROCDIR/$DATE/top.log

### ログローテーション
NUM_DIR=`ls -d $PROCDIR/* | wc -l`
if [ $NUM_DIR -gt $GENERATION ] ; then
 FILE=`ls -d $PROCDIR/* | head -1`
rm -rf $FILE
fi
```

ポイントとしては以下のところです。

###1. top -HでスレッドごとにCPU使用率などを確認可能
障害中にtopコマンドでリソース確認するとたまにひとつのプロセスで400%までCPU使用率が上がっていることがあります。これはtopコマンドがプロセスごとに出しているためです(具体的にはjavaとかは100%超えたりします)。top -Hで出せばスレッドごとに出力できるため400%だったのが4つのスレッドに分かれて100%ずつになったりするので正確にリソースを視認できるようになります。

###2. awkで行ごとに日付と時刻を挿入
awkは```strftime( 書式文字列 [, 時刻] )```で時刻を文字列に変換できます。さらに$0でtopの結果を指して一行で結果をログを出すようにしています。

```BASH:awkでの時間表示
top -b -H -n 1 | awk '{print strftime("%Y/%m/%d %H:%M:%S"), $0}'
```

結果ログ例は以下の通りです。

```top.log
top - 22:16:33 up 5 days, 22:18,  2 users,  load average: 0.08, 0.04, 0.05
Threads: 248 total,   1 running, 247 sleeping,   0 stopped,   0 zombie
%Cpu(s):  3.0 us,  3.0 sy,  0.0 ni, 90.9 id,  3.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :   999720 total,    99196 free,   529668 used,   370856 buff/cache
KiB Swap:  1572860 total,  1426708 free,   146152 used.   221592 avail Mem
   PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
2018/04/20 21:57:01  28349 apache    20   0  577940  16668   5648 S  0.0  1.7   0:00.37 httpd
2018/04/20 21:57:01  28362 apache    20   0  577940  16356   5440 S  0.0  1.6   0:00.21 httpd
2018/04/20 21:57:01  28384 root      20   0  126236   1604    984 S  0.0  0.2   0:00.00 crond
2018/04/20 21:57:01  28435 apache    20   0  577940  16668   5648 S  0.0  1.7   0:00.31 httpd
2018/04/20 21:57:01  28445 root      20   0       0      0      0 S  0.0  0.0   0:00.01 kworker/0:2
2018/04/20 21:57:01  28447 apache    20   0  577940  16296   5400 S  0.0  1.6   0:00.11 httpd
2018/04/20 21:57:01  28482 apache    20   0  470844   8244   2024 S  0.0  0.8   0:00.00 httpd
2018/04/20 21:57:01  28532 apache    20   0  470844   8244   2024 S  0.0  0.8   0:00.00 httpd
```
あとは```chmod +x /usr/local/bin/process```で実行権限をつけておいてください。
ログローテーションは7日分が残るようにしてあります。

##【cron.dに登録】
rootでログインした状態で/etc/cron.dディレクトリ傘下へ移動し、processというファイルを作成します。ここでcronをrootで動かすように設定します。設定の仕方は以下のURLを参考にしました。詳細に記載して頂いておりとても助かりました。ありがとうございます。

[■/etc/crontabと/etc/cron.d設定ファイルの書き方](http://www.server-memo.net/tips/etc-crontab.html)

私は以下の通りに1分毎に実行されるように編集しました。

```BASH:/etc/cron.d/process
#!/bin/bash
*/1 * * * * root /usr/local/bin/process
```

あとはcron.d_serviceを再起動し、自動起動設定しておけば準備完了です。
　※詳細は上記URLを参考にしてください。


簡単ですが以上です。

なにかありましたらコメントから宜しくお願い致します。
softetherの設定メモ

# Softetherの設定方法メモ
自宅サーバとしてRaspberryを稼働し、そこに宅外から自宅へアクセスを可能とするため、SoftetherでVPNサーバを立ち上げる。その設定手順を記載する


# 環境説明
- Raspberry Pi3 B
- CentOS 7.4.1708

# 設定１（暫定）
宅外からVPN接続し、自宅LANに接続されている機器にアクセス可能となる。しかしVPNサーバ自身にはアクセスできない

ローカルブリッジ接続を作成するときに、物理的な既存のLANカードとのブリッジ接続を選択し、LANカードとして、RaspberryPiのLANカード（eth0）を選択する

VPNサーバ自身にアクセス可能とするためには、Softether公式サイトではサーバにローカルブリッジ用のLANカードを増設する事を推奨している

https://ja.softether.org/4-docs/1-manual/3._SoftEther_VPN_Server_%E3%83%9E%E3%83%8B%E3%83%A5%E3%82%A2%E3%83%AB/3.6_Local_Bridges#3.6.3_.E3.83.AD.E3.83.BC.E3.82.AB.E3.83.AB.E3.83.96.E3.83.AA.E3.83.83.E3.82.B8.E7.94.A8.E3.81.AE_LAN_.E3.82.AB.E3.83.BC.E3.83.89.E3.81.AE.E6.BA.96.E5.82.99
vagrant + firebase loginでブラウザ認証が失敗する場合の解決方法

## こんな時
vagrantで立ち上げたVM上でfirebase login => ブラウザ認証がしたい
しかし…

```sh
$ firebase login

? Allow Firebase to collect anonymous CLI usage and error reporting information? Yes

Visit this URL on any device to log in:
https://accounts.google.com/o/oauth2/auth?client_id=xxxxxxxxxxxxxxxxx....
```

![login.PNG](https://qiita-image-store.s3.amazonaws.com/0/119363/889cd372-7426-566a-0660-d4e9d06c5f4a.png)


![fail.PNG](https://qiita-image-store.s3.amazonaws.com/0/119363/d3d99d9e-519f-6e04-9c87-06abc4a09fd6.png)

:sob:

こうなった時

## 解決
VM ⇔ ホストPCで9005ポートをフォワーディングさせる
Vagranfileに以下を追記し、VMを再起動

```ruby:Vagrantfile
Vagrant.configure("2") do |config|
   # something

  config.vm.network "forwarded_port", guest: 9005, host:9005 # Add this line!

  # something
end
```

再起動後、VM上でfirebase login ⇒ ブラウザ認証してみる

```sh
firebase login
```

![success.PNG](https://qiita-image-store.s3.amazonaws.com/0/119363/83f05e23-9a39-d119-9394-67ba77cae0c6.png)

いけたー:blush:
【エラー】'Flutter/Flutter.h' file not found 対処法

# 前書き
Flutterアプリで使っていたプラグイン（image_picker）などから突然

> 'Flutter/Flutter.h' file not found`

というエラーが発生しました。
その解決策についてです。
[こちらのissue](https://github.com/flutter/flutter/issues/16036)に大変助けられました。本当にありがとうございます。

# 対処法
1. `ios/Podfile.lock` を削除
2. `ios/Podfile` の中身を[こちら](https://github.com/flutter/flutter/tree/master/packages/flutter_tools/templates/cocoapods)に書き換える
    - プロジェクトに合わせてobjCかSwiftか選ぶ

# 環境
- Xcode Version 9.2 (9C40b)
- macOS HighSierra Version 10.13.4
mruby on EV3RT+TECSをビルドする(Windows/Mac)


## mruby on EV3RT+TECS をダウンロード
TOPPERSプロジェクトからmruby on EV3RT+TECSをダウンロードします。
https://www.toppers.jp/tecs.html#mruby_ev3rt
2018年度ETロボコン参加者向けには2.0.1をおすすめします。

## 解凍
```
tar zxvf mruby-on-ev3rt+tecs_package-beta2.0.1.tar.gz
```

## ビルド
解凍するとできたフォルダの中に「mruby-on-ev3rt+tecs_packageビルド手順」というPDF(ev3rt+tecs/doc/mruby_on_ev3rt+tecs_build.pdf)があります。

### windows
「mruby-on-ev3rt+tecs_packageビルド手順」にしたがってビルドしてください

### Mac

環境構築は
[Mac OS X でETロボコンに出よう！(EV3RT 環境構築編）](https://qiita.com/yamanekko/items/3cee3991ea9472a1f6b6)を参考にしてください。

Macの場合はcfgが必要です
[EV3RTのコンフィギュレータ（cfg）のインストール](
https://qiita.com/yamanekko/items/3cee3991ea9472a1f6b6#ev3rt%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%95%E3%82%A3%E3%82%AE%E3%83%A5%E3%83%AC%E3%83%BC%E3%82%BFcfg%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)を参考にしてください。

「mruby-on-ev3rt+tecs_packageビルド手順」にしたがってビルドしてください
P7 mrubyのビルド以降はMacでもほとんど同じです
ただし、以下について変更する必要があります。

P10 SDドライブの指定
hr-tecs/workspace/bluetooth/Makefile
```SD_DIR=/Volumes/(SDカードのドライブ名)```
LibreOfficeでGoogle翻訳-1

#####実行した環境

Ubuntu Stdio 17.10
LibreOffice 6.0.0.3
Python 3.5.4(LibreOfficeバンドル)

#####googletrans 2.2.0というGoogle翻訳のパッケージを見つけました
https://pypi.org/project/googletrans/#description

インストール(LibreOfficeバンドルのPythonではなく、UbuntuのPython 3.6.3にインストール)
$ pip3 install googletrans

LibreOfficeバンドルのPythonで使用するには、
LibreOfficeバンドルのPythonにUbuntu - Pythonのパッケージのパスを追加する
https://qiita.com/ty21ky/items/3b944a7abe23e3bcaf8f
を実行します。

ドキュメント
https://media.readthedocs.org/pdf/py-googletrans/latest/py-googletrans.pdf

主なcountry code ： LANGUAGES（ドキュメントの最後に記載）
'zh-cn' ： '中国語（簡体字）'
'zh-tw' ： '台湾語'
'en' ： '英語'
'fr' ： 'フランス語'
'de' ： 'ドイツ語'
'ja' ： 'japanese'
'ko' ： 'korean'

主な使い方（下記のサンプルプログラムはLibreOfficeではなくPythonで実行する。）
class googletrans.models.Translated(src,dest,origin,text,pronunciation)
Translate result object(オブジェクトの翻訳)
Parameters
 •src– source langauge ソース言語(default: auto)省略すると自動検出
 •dest– destination language 翻訳後の言語(default: en)省略すると英語
 •origin– original text(元のテキスト)
 •text– translated text(翻訳されたテキスト)
 •pronunciation– pronunciation(発音記号)

翻訳(英語＞日本語)

```python:translate.py
import pyperclip
from googletrans import Translator

translator = Translator()

a = 'Googletrans is a free and unlimited python library that implemented Google Translate API. This uses the Google Translate Ajax API to make calls to such methods as detect and translate.'

print(translator.translate(a, dest='ja').text)
```

 ```shell-session
$ python3 translate.py
Googletransは、Google Translate APIを実装した無制限のPythonライブラリです。これは、Google Translate Ajax APIを使用して、検出や翻訳などのメソッドを呼び出します。
```

翻訳(日本語＞台湾語)

```python:translate1.py
import pyperclip
from googletrans import Translator

translator = Translator()

a = '実行する前に文章をコピーする。'

print(translator.translate(a, src='ja',dest='zh-tw').text)
```


```shell-session
$ python3 translate1.py
運行前複製句子。

```

発音記号を表示（src=destの時のみ）

```python:pronunciation.py
import pyperclip
from googletrans import Translator

translator = Translator()

a = '実行する前に文章をコピーする。'

print(translator.translate(a, dest='ja').pronunciation)
```


```shell-session
$ python3 pronunciation.py
Jikkō suru mae ni bunshō o kopī suru.

```

ソース言語が何語か調べる

```python:src.py
import pyperclip
from googletrans import Translator

translator = Translator()

a = 'Merci pour votre gentillesse.'

print(translator.translate(a, dest='ja').src)
```

```shell-session
$ python3 src.py
fr
```

オリジナルの文章を表示

```python:origin.py
import pyperclip
from googletrans import Translator

translator = Translator()

a = 'Merci pour votre gentillesse.'

print(translator.translate(a, dest='ja').origin)
```

```shell-session
$ python3 origin.py
Merci pour votre gentillesse.
```
RailsのFront EndでTypeScriptを動かすまで

Rails 5.xアプリのFront Endを今まではCoffeeScriptで開発してたのですが，最近の流行に乗ってTypeScriptをさわってみたくなり，Railsアプリ上でTypeScriptを動かすところまでをまとめてみました．

# 環境セットアップ
素のRails環境からだと，nodejs, npm, yarnあたりが追加でInstall必要でした．
環境次第で他にも必要なものがあるかも．

## nodejs / npm
nodejs, npm は ↓ のサイトを参考にInstallしました．
https://qiita.com/seibe/items/36cef7df85fe2cefa3ea

### Proxy環境下だとProxyの設定が必要
(http_proxyを環境変数に入れている場合，`sudo -E` とかでenv引き継いでsudoする必要あり)

### SSL Errorになることがある
↓ こちらを参考に `npm config set strict-ssl false` で一時的に回避しました．
https://blog.yug1224.com/archives/563d9b67bf652a600632d01e

## yarn
↓ こちら参考にyarnもInstall.
https://qiita.com/darai0512/items/9e0a2c77d8d3ddf5c0fe


# Gem追加
```Ruby
gem 'webpacker', git: 'https://github.com/rails/webpacker.git'
```
webpackerを追加して，いつもの `bundle install`．

# webpackerインストール
`rails webpacker:install`
でwebpackerをインストールします．(yarnが入ってないとココで怒られます)
この時点で，TypeScriptをCompileするとき用のCommand `bin/webpack` が追加されています．

# webpackerにTypeScript追加
`rails webpacker:install:typescript`
最初のサンプルコードになる `app/javascript/packs/hello_typescript.ts` など追加されます．

自動生成されるサンプルコードは↓な感じ．(これだけだと素のJSと何も変わらん)
 
```ts:app/javascript/packs/hello_typescript.ts
// Run this example by adding <%= javascript_pack_tag 'hello_typescript' %> to the head of your layout file,
// like app/views/layouts/application.html.erb.

console.log('Hello world from typescript');
```

# TypeScriptをCompile
`$ bin/webpack`
で app/javascript 配下の.tsをCompileしますが，Versionによっては ↓ のようなErrorが出ることがあるようです．(ありました)

```
ERROR in ./app/javascript/packs/hello_typescript.ts
Module build failed: TypeError: Cannot read property 'afterCompile' of undefined
```
ほぼ空っぽのサンプルコードなので，何のことやらさっぱりですが，
↓ によると，`ts-loader` なるもののversionを落とすことで回避できるらしい．
https://github.com/angular/angular-cli/issues/9783

### 追記 2018/06/19
`package.json`の`ts-loader`と`Gemfile`の`webpacker`のVereion一致はわりとシビアらしく，
今日時点最新の`ts-loader`+`webpacker`でもCompile時にErrorでました．(`Webpack`のVersionは4以上が必須，的な)

↓ のように`3.5.0`に戻せば動きはしますが，最新とVersion乖離が進んでしまうので，できる限り最新で安定動作するVersionの組み合わせを調べないといけません．．．
---/// 追記ここまで



npm/yarnの構成ファイルらしい`package.json`の`ts-loader`のversionを3.5.0にします．

```json:package.json
{
  "name": "your-project",
  "private": true,
  "dependencies": {
    "@rails/webpacker": "^3.4.3",
    "ts-loader": "^3.5.0",
    "typescript": "^2.8.3"
  },
  "devDependencies": {
    "webpack-dev-server": "^3.1.3"
  }
}
```

変更後に `yarn install` した後，`bin/webpack` でCompileが通ると思います．

# HTMLからTypeScript呼び出し
サンプルコードの冒頭にも書かれていたとおり，
`<%= javascript_pack_tag 'hello_typescript' %> `
をHTMLに追加すれば呼び出せる模様．

HTMLから呼び出しのEntry Pointとして使えるのは，`app/javascript/packs` に配置したものだけらしい．

実際に↑のTagを追加したHTMLをChromeで読み込んでConsole出力を見てみると，

```
Hello world from typescript
```
が出力されているはずです．

# Production環境で動かす
webpack/typescript特有の処理は特に必要なく，いままでどおりのassets処理でOKぽいです．

```ruby
# 中間生成物+成果物の除去．public/assetsとpublic/packs以下を全削除．
rake assets:clobber

# 通常のsprocketsのassets pipeline処理のあとに，webpackのcompileが始まる．
rake assets:precompile

rails s
```

# おわり

---///
SASのTips集

SASはなかなか情報がないので、知っていると結構役立つ情報をまとてみようかと
随時更新します

最終更新：20180425 システムオプションを追加

# システムオプション

## mprint

マクロ実行時に行われるSASステートメントをログに出力する。

## mlogic

マクロ変数の評価式やマクロの実行開始、終了をログに出力する。

## symbolgen

マクロ変数の置換結果を表示する。

## fullstimer

ステップ実行ごとに、リソース使用状況を出力する。

## mesglevel

出力されるログにINFO系のログを追加する。

用途としては、マージ時の意図しない同一変数の上書きなどを検知できる。

```sas: msglevelc例
options msglevl = i;
```

## mergenoby

マージ時に、byによってキーが指定されていない場合の動作を指定する。
デフォルトでは特に何もしないが、ERRORを出したり、WARNINGを出したりできる。

```sas: mergenoby例
options mergenoby = error;
```

## compress

データセットの圧縮方法を指定する。
デフォルトは、NO（圧縮しない）。

```sas: compress例
options compress = yes;
```

## noxwait

Xコマンド実行後、開かれたコマンドプロンプトのウィンドウを自動的に閉じ、次のステートメントに移行する。


# dataステップ

## 関数
### index関数

指定した文字列が最初に出る位置を返す。
存在しない場合には、0を返す。
なお、2バイト文字を含む場合は、kindexを用いないと意図しない動作になることがある。

```sas:index例
data _null_;
   x = index("abcd efg hijk lmn", "jk");
   put x=;
run;
```


## callルーチン
### call symputx

データステップ内で、指定の名前のマクロ変数に、変数値や値を格納できる。
その際に、余白は削除される。(trimされる)
類似のcallルーチンに「call symput」が存在するが、
こちらは入力文字列に余白がある場合、その余白も含めてマクロ変数に格納される。

```sas:symputx例
data _null_;
   x = "abc";
   call symputx("MCR", x);
run;

%PUT &MCR.;
```

### call system



# プロシジャ

## sortプロシジャ
### noequalsオプション

sortプロシジャでは、デフォルトでは安定ソートを実行する。
（equals指定により明示的に安定ソートを指定できる）
noequalsを指定すると非安定ソートになるが、計算量の面で優位である。

```sas:noequalsオプション例
proc sort
  data = test
  noequals;
  by var1;
run;
```
C++ではnull pointerをdeleteしても安全だった

諸事情でC++のreferenceを見ていて発見した。

http://en.cppreference.com/w/cpp/language/delete

>If expression evaluates to a null pointer value, no destructors are called, and the deallocation function may or may not be called (it's implementation-defined), but the default deallocation functions are guaranteed to do nothing when handed a null pointer.
(until C++14)
>
>If expression evaluates to a null pointer value, no destructors are called, and the deallocation function is not called.
(since C++14)

C++14を境に微妙に動作が異なるが、null pointerをdeleteしても何も起きないようだ。

やったねif文が減らせるよ！

```cpp
//現在
if(p){
    delete p;
}

//これから
delete p;
```
sshポートフォワード メモ

# ことのはじまり

「【外部からはアクセスできないネットワーク】にアクセスできるネットワーク（つまり内部ネットワーク）」に外部からsshできる僕は【外部からはアクセスできないネットワーク】に外部からアクセスする権利あるのでは...？と考えた（アホ）。
だって結局、「【外部からはアクセスできないネットワーク】にアクセスできるネットワーク」にsshしてしまえば【外部からはアクセスできないネットワーク】にアクセスできるんだもの（sshした時点でもう内部なので当たり前）。
調べたらsshポートフォワードという技術があるらしい。

# 名称の整理

・【外部からはアクセスできないネットワーク】
ここが目的なので、ここにポートフォワードさせたい。ということで、「フォワード先」と呼ぶことにします。

・【外部からはアクセスできないネットワーク】にアクセスできるネットワーク
要するに「フォワード先にアクセスできるネットワーク」のことなので、フォワードさせるための「仲介サーバ」と呼ぶことにします。

・僕
要するにローカルのこと。
フォワードさせるネットワークになるので、「フォワード元」と呼ぶことにします。

# フォワード元から仲介サーバにsshできる場合

```
ssh 仲介サーバ -L フォワード元ポート:フォワード先IP:フォワード先ポート
```

トンネルを作りながら仲介サーバにsshするイメージです。

![F2C8D330-AD26-41ED-B740-D2F239A42113.jpeg](https://qiita-image-store.s3.amazonaws.com/0/132486/8036bc60-301a-b142-6405-560c4843deb9.jpeg)

# 仲介サーバからフォワード元にsshできる場合

```
ssh フォワード元IP -R フォワード元ポート:フォワード先IP:フォワード先ポート
```

フォワード元に一度sshして、仲介サーバへ戻りながらトンネルを作っていくイメージです。

![C3EC2B1A-AF1A-4F06-B8E1-605A5160A1A8.jpeg](https://qiita-image-store.s3.amazonaws.com/0/132486/6f8497f9-8eaa-6637-7080-9ee3182362e3.jpeg)

# 注意

フォワード先が仲介サーバの場合、「フォワード先IP」は「localhost」になります。
なぜかというと、コマンド最後の「フォワード先IP:フォワード先ポート」の部分は「sshした後」で考えるからです。

# その他のおすすめオプション

・-N

リモートコマンド（sshすると同時にコマンドを実行させるやつ）を実行しません。
つまり、ポートフォワードだけ行います。

・-f

バックグラウンドでsshします。

# 参考

・[ SSHポートフォワード（トンネリング）を使って、遠隔地からLAN内のコンピュータにログインする - ククログ(2014-09-12)](http://www.clear-code.com/blog/2014/9/12.html) ( [archive](http://archive.is/W2VKY) )
・[sshポートフォワーディング - Qiita](https://qiita.com/tukiyo3/items/235e19ae24b68c59e540#vpn%E4%BB%A3%E3%82%8F%E3%82%8A-%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB---%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88) ( [archive](http://archive.is/BAfoo) )
・[ssh ポート転送](http://www.geocities.jp/ko_tyche/linux/port.html) ( [archive](http://archive.is/rTzdN) )
JAVASILVER取得備忘録

# 【前置き】
今週のアウトプットってほどでもないですが・・・
今更SILVERかい！とか言われるかもしれませんが、GOLD受けるにもSILVER受けねばならないので順当です。業務でJAVAを齧れるようになってから取れると思っていたけど受けに入ってなかったので・・・自社がアレすぎてまともな経験値を得られなかった私は経験的な事を語り難いので少しくらい足しにならないかなぁと。せっかくなのでこれから取りに行く若くて未来ある方々の少しでも足しになればいいなとここに記します。

# 【結果】
受験費：28,728円
テキスト代：3200+税円
参考書：徹底攻略 Java SE 8 Silver 問題集[1Z0-808]対応
試験前スペック：業務で簡単な機能ぽちぽち作る程度。

勉強期間：参考書2週程度（時間は人による）

試験時間：150分（わたしは60分で終わりにしちゃいました）

点数：87％（合格ライン65％）

ちょっと怪しいかなと思った問題が2問くらいだったですが、思ったより削れてて辛い。
腑に落ちない・・・

# 【進め方】
経験年数問わずJAVA書いた人向けの進め方です。
参考書は黒本だけでOK。一部形式が違うものが出ましたが、
問題の出題形式は9割黒本形式なのでこれだけで大丈夫です。
JAVA経験者でも黒本は推奨です。理由は三つあって、

①問題の出題形式がわからないと試験に時間がかかってしまう。
②通常業務じゃこんなの書かないわ！！っていう罠的なコードがあり、細かい言語仕様を問われる。
③通常IDEがコンパイルエラーはいてくれてる所を肉眼確認しないといけない。

本番の問題は77問、黒本に77問*2パターンほどあるので試験前の追い込みには最適です。最初は何も見ずに黒本を一周してみて下さい。その後答え合わせ。
↓
結果が現在の実力です、経験年数によって差が出ると思われますが経験者なら50%～あるんじゃないでしょうか、合格に後ちょいとスパイスがいります（罠コードの影響なんですが・・・）もちろん5年～とかしてるといきなり万点とかあるかもしれないです。

間違えた所の『解説』を読みましょう。腑に落ちるまで読みましょう。こうじゃなかったかなぁ？と思ってたら実は微妙に挙動が違ってるとかあるあるです。答えを覚える必要はありません。一応正解している部分の解説を見るのもいいと思いますが、特に何も見ずにコード見て正解してる所は二回目もてけとーにやっても正解すると思うので。やりこみすぎて答えを覚えるようにならなければ好きなようにするといいと思われます。

2週目、前回の負債をふまえまた無心で解きましょう。そして答え合わせ。
おそらく9割くらいは出来るようになってると思います。本番でのイレギュラーあわせても合格ライン。試験前日か前には1割を補いましょう。こんな流れでいけます。

いい点数取れてない私が言うのもなんですが、PG資格は凄く簡単です。
理由は簡単、コードが読めれば点数取れるからです。経験者に凄く有利でSILVERなら勉強しなくてもいける人いてもおかしくないです。GOLDからは実務じゃこの機能あまり使わないねとかが結構あると思うので経験者でも無勉強だと無理だと思います。

# 【後書き】
試験時間90分あまったんですが、私は試験にトラウマがあって見直しすればするほど悪くなる傾向が強くて（疑心暗鬼になりすぎるぅぅ）控えたのですが、恐らくケアレスミスとかしてると思うので難しい問題を見直すというより簡単な奴をさくっと確認した方がよかったですね。反省。いろいろやらないといけない事があって他言語だったりインフラ周りだったり、転職活動だったり。転職活動のお話して足りない所が見えてきたので、もしマッチングしない場合は半年ほど時間を空けるかもしれません。SES（雑務）⇒WEBにスキルチェンジするのに足りない所が多くあります。それが業務をやりつつ補っていける企業様なら当方は嬉しいですが、やはり即戦力が求められますし、その場合だとお互い幸せになれないので・・・。足は止めないようにしたいと思ってます。