OmniAICreator/Qiita-1.07M huggingface dataset:
zsh で N 個のスペースからなる文字列を生成したい

例えば Ruby では以下のようにすればできる。

```ruby
n = 8
spaces = " " * n
p spaces # => "        " （8個のスペースからなる文字列）
```

zsh の場合は printf を使えば作れる。

```zsh
$ n=8
$ spaces=$(printf "%${n}s" "")
$ typeset -p spaces
typeset spaces='        '
```

けど、printf を使わなくても Parameter Expansion Flags を利用するともっと簡単に書ける。

```zsh
$ n=8
$ spaces=${(l:$n:):-}
$ typeset -p spaces
typeset spaces='        '
```

`${:-}` で空文字を作り、指定文字数分右詰めにしてくれる `l:N:` フラグをつけている。
`l:N:` は標準で半角スペースで埋めてくれるが、padding に使う文字は指定できて、例えば `l:N::0:` というようにすれば zero padding になる。
【Revit】要素IDから解析モデルのサーフェスを取得する

要素IDから[解析モデルサーフェス](http://www.revitapidocs.com/2018.1/8c656a67-d41d-c5e5-f75a-554173dfcdd9.htm)を取得します。

```C#
/// <summary>
/// 要素IDから解析モデルのサーフェスを取得する
/// </summary>
/// <param name="elementIds"></param>
/// <returns></returns>
private List<AnalyticalModelSurface> GetAnalyticalModelSurfaces(List<ElementId> elementIds)
{
    List<AnalyticalModelSurface> surfaces = new List<AnalyticalModelSurface>();

    foreach (ElementId id in elementIds)
    {
        try
        {
            Element element = this.doc.GetElement(id);
            if (element is AnalyticalModelSurface)
            {
                AnalyticalModelSurface surface = element as AnalyticalModelSurface;
                surfaces.Add(surface);
            }
            else
            {
                this.excemsg = "解析モデルID：" + id.ToString() + "：解析モデルサーフェスではありません。";
                log.put_log("DEBUG", System.Reflection.MethodBase.GetCurrentMethod().Name, this.excemsg);
            }
        }
        catch (Exception exce)
        {
            this.excemsg = "解析モデルID：" + id.ToString() + "：" + exce.Message;
            log.put_log("WARN", System.Reflection.MethodBase.GetCurrentMethod().Name, this.excemsg);
        }
    }

    if (surfaces.Count() <= 0)
    {
        this.outmsg = "構造解析モデルのサーフェス情報が取得できませんでした。";
        log.put_log("ERR", System.Reflection.MethodBase.GetCurrentMethod().Name, this.outmsg);
    }

    return surfaces;
}
```
PermissionSet Builder

# Page Link
[PermissionSet Builder](http://salesforcexytools.com/SalesforcexytoolsForSublime/SalesforceXytoolsForSublime-012-PermissionSet-Builder.html)



# Topic

* Use [SalesforceXytoolsForSublime](http://salesforcexytools.com/categories/SalesforcexytoolsForSublime/) To Build fieldPermission and objectPermission

> 1. Build permissionset file
>

# Environment

- Make sure you can login your sfdc. Test it : SFDC-XY > Login SFDC


# Create Permission.xml

## Open SObject Manager Page

`Permission Builder> Build Profile FieldPermissions`

![1540457828769](http://salesforcexytools.com/images/xytools_images/1540457828769.png)

Select your field

![1540457987197](http://salesforcexytools.com/images/xytools_images/1540457987197.png)

The Permissionset file :
```xml
<?xml version="1.0" ?>
<PermissionSet xmlns="http://soap.sforce.com/2006/04/metadata">
  <fieldPermissions>
    <editable>true</editable>
    <field>Blog__c.comment__c</field>
    <readable>true</readable>
  </fieldPermissions>
  <objectPermissions>
    <allowCreate>true</allowCreate>
    <allowDelete>true</allowDelete>
    <allowEdit>true</allowEdit>
    <allowRead>true</allowRead>
    <modifyAllRecords>true</modifyAllRecords>
    <object>Blog__c</object>
    <viewAllRecords>true</viewAllRecords>
  </objectPermissions>
  <hasActivationRequired>false</hasActivationRequired>
  <label>AllPermission</label>
  <license>Salesforce</license>
</PermissionSet>
```

# Deploy permission.xml

right click , deploy it.
How to export Apex Code Coverage

# Page Link
[How to export Apex Code Coverage](http://salesforcexytools.com/SalesforcexytoolsForSublime/SalesforceXytoolsForSublime-011-Apex-Coverage.html)



# Topic

* Use [SalesforceXytoolsForSublime](http://salesforcexytools.com/categories/SalesforcexytoolsForSublime/) To Export `Apex Code Coverage`

> 1. Export `Apex Code Coverage`
>

# Environment

- Make sure you can login your sfdc. Test it : SFDC-XY > Login SFDC


# Sobject

## Open SObject Manager Page

`ApexTest > Show Apex Code Coverage`

![1540443192921](http://salesforcexytools.com/images/xytools_images/1540443192921.png)

Result

![1540443323472](http://salesforcexytools.com/images/xytools_images/1540443323472.png)
Copy a Lightning Component

# Page Link
[Copy a Lightning Component](http://salesforcexytools.com/SalesforcexytoolsForSublime/SalesforceXytoolsForSublime-016-Copy-Lightning-component.html)



# Topic

* Use [SalesforceXytoolsForSublime](http://salesforcexytools.com/categories/SalesforcexytoolsForSublime/) To Copy a Lightning Component

# Environment

- Make sure you can login your sfdc. Test it : SFDC-XY > Login SFDC

# Copy Lightning Component

Select your Lightning component.

![1540539008255](http://salesforcexytools.com/images/xytools_images/1540539008255.png)

Right Click, `SFDC-Xy > Copy Lightning Component`. 

![1540539047383](http://salesforcexytools.com/images/xytools_images/1540539047383.png)

Input your new component name.

![1540539148418](http://salesforcexytools.com/images/xytools_images/1540539148418.png)

Check the new component.
![1540539896624](http://salesforcexytools.com/images/xytools_images/1540539896624.png)

# Deploy The component

choose your folder or source in sublime folders, then right click.

Find the menu : `Sfdc-Xy > Deploy Directory To SFDC`

![1540445304166](http://salesforcexytools.com/images/xytools_images/1540445304166.png)
Search sfdc metadata

# Page Link
[Search sfdc metadata](http://salesforcexytools.com/SalesforcexytoolsForSublime/SalesforceXytoolsForSublime-015-Search-SFDC-Metadata.html)



# Topic

* Use [SalesforceXytoolsForSublime](http://salesforcexytools.com/categories/SalesforcexytoolsForSublime/) To Search Metadata

# Environment

- Make sure you can login your sfdc. Test it : SFDC-XY > Login SFDC

# Search Metadata

`SFDC-XY > Search Metadata`

![1540532540638](http://salesforcexytools.com/images/xytools_images/1540532540638.png)

Select metadata type.

![1540532580583](http://salesforcexytools.com/images/xytools_images/1540532580583.png)

For example, Select `Profile`,  You can find the list of metadata.

Selcet `Admin.profile`, It will jump to sfdc Admin profile page.

![1540532640276](http://salesforcexytools.com/images/xytools_images/1540532640276.png)



![1540532907894](http://salesforcexytools.com/images/xytools_images/1540532907894.png)



# Support Metadata Type
Save Your Sfdc Module and build a deploy module package

# Page Link
[Save Your Sfdc Module and build a deploy module package](http://salesforcexytools.com/SalesforcexytoolsForSublime/SalesforceXytoolsForSublime-014-Build-Deploy-Module.html)



# Topic

* Use [SalesforceXytoolsForSublime](http://salesforcexytools.com/categories/SalesforcexytoolsForSublime/) To Save your sfdc module
* deploy module package

# Environment

- Make sure you can login your sfdc. Test it : SFDC-XY > Login SFDC

# Save a module

Open the source.

![1540519797063](http://salesforcexytools.com/images/xytools_images/1540519797063.png)

Right Click , `SFDC-XY Toolbox> Save Module(From Open Files)`

![1540519843822](http://salesforcexytools.com/images/xytools_images/1540519843822.png)

Input your save path

![1540519944813](http://salesforcexytools.com/images/xytools_images/1540519944813.png)

Check your module

![1540521537775](http://salesforcexytools.com/images/xytools_images/1540521537775.png)



# Deploy your module

## fix your target sfdc info
open `build.properties`

```properties
sf.username = {username}
sf.password = {password}
#sf.sessionId = <Insert your Salesforce session id here.  Use this or username/password above.  Cannot use both>
#sf.pkgName = <Insert comma separated package names to be retrieved>
#sf.zipFile = <Insert path of the zipfile to be retrieved>
#sf.metadataType = <Insert metadata type name for which listMetadata or bulkRetrieve operations are to be performed>

# Use 'https://login.salesforce.com' for production or developer edition (the default if not specified).
# Use 'https://test.salesforce.com for sandbox.
sf.serverurl = {serverurl}
sf.maxPoll = 500
sf.pollWaitMillis = 10000
# If your network requires an HTTP proxy, see http://ant.apache.org/manual/proxy.html for configuration.
#
```


## windows

only check your code:  click `deployCodeCheckOnly.bat` only!

deploy your code:  click `deployCodeRunLocalTests.bat` only!

## Linux/Mac

only check your code

```
ant deployCodeCheckOnly
```

deploy your code

```
ant deployCodeRunLocalTests
```
Export Sfdc Sobject Schema To Excel

# Page Link
[Export Sfdc Sobject Schema To Excel](http://salesforcexytools.com/SalesforcexytoolsForSublime/SalesforceXytoolsForSublime-008-Export-Sobject-Schema-To-Excel.html)



# Topic

- Use [SalesforceXytoolsForSublime](http://salesforcexytools.com/categories/SalesforcexytoolsForSublime/) To Config Dataloader and backup sfdc sobject data.

> 1. Export Sfdc Sobject Schema To Excel.

# Environment

- Make sure you can login your sfdc. Test it : SFDC-XY > Login SFDC

# Sobject Schema To Excel

Open Sublime-Menu : SFDC-XY > Sobject > Export Sobject Schema To Excel

![1539935245815](http://salesforcexytools.com/images/xytools_images/1539935245815.png)

Example,

![1539935461910](http://salesforcexytools.com/images/xytools_images/1539935461910.png)
Soql Creator

# Page Link
[Soql Creator](http://salesforcexytools.com/SalesforcexytoolsForSublime/SalesforceXytoolsForSublime-013-Create-Soql.html)



# Topic

* Use [SalesforceXytoolsForSublime](http://salesforcexytools.com/categories/SalesforcexytoolsForSublime/) To Create soql

# Environment

- Make sure you can login your sfdc. Test it : SFDC-XY > Login SFDC


# Create Soql

`SFDC Code Creator > Create Soql`

![1540459992691](http://salesforcexytools.com/images/xytools_images/1540459992691.png)

Select Soql Type

![1540460017305](http://salesforcexytools.com/images/xytools_images/1540460017305.png)



result :

```sql
select 
			Id,				//カスタムオブジェクト ID
			OwnerId,				//所有者 ID
			IsDeleted,				//削除
			Name,				//ブログNo
			RecordTypeId,				//レコードタイプ ID
			CreatedDate,				//作成日
			CreatedById,				//作成者 ID
			LastModifiedDate,				//最終更新日
			LastModifiedById,				//最終更新者 ID
			SystemModstamp,				//System Modstamp
			LastViewedDate,				//最終閲覧日
			LastReferencedDate,				//最終参照日
			comment__c,				//評価
			comment_status__c,				//評価ステータス
			content__c,				//内容
			excerpt__c,				//概要
			status__c,				//ステータス
			title__c,				//タイトル
			ReadOnlyTest__c,				//ReadOnlyTest
			FormulaTest__c,				//数式テスト
			Account__c				//取引先
from Blog__c

```
Salesforce package.xml Auto Builder

# Page Link
[Salesforce package.xml Auto Builder](http://salesforcexytools.com/SalesforcexytoolsForSublime/SalesforceXytoolsForSublime-010-Packagexml-Builder.html)



# Topic

* Use [SalesforceXytoolsForSublime](http://salesforcexytools.com/categories/SalesforcexytoolsForSublime/) To Build package.xml

> There are 2 ways to build package.xml 
> 1. Build From SFDC API.
> 2. Use local file to build package.xml.

# Build package.xml From Server

> Sublime-Menu :SFDC-XY > Package Builder > Build Package.xml From Server

![1539845253603](http://salesforcexytools.com/images/xytools_images/1539845253603.png)



You can build package.xml like below.

```xml
<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">

    <types>
        <members>*</members>
        <name>InstalledPackage</name>
    </types>
    <types>
        <members>*</members>
        <name>CustomLabels</name>
    </types>
    <types>
        <members>*</members>
        <name>StaticResource</name>
    </types>
   ............
   ............
   ............
   ............
   ............
   ............
   ............
   ............
    <types>
        <members>*</members>
        <name>Settings</name>
    </types>
    <version>42.0</version>
</Package>

```



# Build package.xml From Open Files

Example, Open `Account.object`,`Blog.page`,`BlogController.cls`,`Blog__c.object` in Sublime

![1539846980157](http://salesforcexytools.com/images/xytools_images/1539846980157.png)

> Sublime-Menu : SFDC-XY > Package Builder > Build package.xml From Open Files

You can build package.xml like below.

```xml
<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">

    <types>
        <members>Blog</members>
        <name>ApexPage</name>
    </types>
    <types>
        <members>BlogController</members>
        <name>ApexClass</name>
    </types>
    <types>
        <members>Account</members>
        <members>Blog__c</members>
        <name>CustomObject</name>
    </types>
    <version>42.0</version>
</Package>

```



# Summary

## Package Builder

### Build Package.xml From Server

`Package Builder > Build Package.xml From Server`
Export all package.xml from server

### Build Package.xml From Server From Open Files

```
Package Builder > Build Package.xml From Open Files
```

### Build The deploy package from open files

`Package Builder > Build Deploy Package From Open Files`
This is only copy the open files to a dir, not deploy to server.
Use SalesforceXytoolsForSublime Salesforce Deploy Package

# Page Link
[Use SalesforceXytoolsForSublime Salesforce Deploy Package](http://salesforcexytools.com/SalesforcexytoolsForSublime/SalesforceXytoolsForSublime-009-DeployPackage-Builder.html)



# Topic

* Use [SalesforceXytoolsForSublime](http://salesforcexytools.com/categories/SalesforcexytoolsForSublime/) To Build Salesforce Deploy Package

# Example

Example, Open `Account.object`,`Blog.page`,`BlogController.cls`,`Blog__c.object` in Sublime

![1539846980157](http://salesforcexytools.com/images/xytools_images/1539846980157.png)

> Sublime-Menu : SFDC-XY > Package Builder > Build Deploy package From Open Files
>
> Input your save path

You can build package.xml like below.

```
src
  │  package.xml
  │
  ├─classes
  │      BlogController.cls
  │      BlogController.cls-meta.xml
  │
  ├─objects
  │      Account.object
  │      Blog__c.object
  │
  └─pages
          Blog.page
          Blog.page-meta.xml
```



about package.xml

```xml
<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">

    <types>
        <members>Blog</members>
        <name>ApexPage</name>
    </types>
    <types>
        <members>BlogController</members>
        <name>ApexClass</name>
    </types>
    <types>
        <members>Account</members>
        <members>Blog__c</members>
        <name>CustomObject</name>
    </types>
    <version>42.0</version>
</Package>

```
Run sfdc soql, apex script, tooling api

# Page Link
[Run sfdc soql, apex script, tooling api](http://salesforcexytools.com/SalesforcexytoolsForSublime/SalesforceXytoolsForSublime-005-RunScript.html)



# Topic

* Use [SalesforceXytoolsForSublime](http://salesforcexytools.com/categories/SalesforcexytoolsForSublime/) 

> 1. Run soql query
> 2. Run apex script
> 3. Run tooling query
>

# Environment

- Make sure you can login your sfdc. Test it : SFDC-XY > Login SFDC


# Run Soql query

**First, Select your soql**

Then right click, `SFDC-XY Run > SOQL Query`

![1540440544578](http://salesforcexytools.com/images/xytools_images/1540440544578.png)



result :

![1540440661762](http://salesforcexytools.com/images/xytools_images/1540440661762.png)



# Run Apex Script

select your apex script, 

 right click, `SFDC-XY Run > Run Apex Script`

![1540441049661](http://salesforcexytools.com/images/xytools_images/1540441049661.png)

# Run Tooling query

select your tooling query, 

 right click, `SFDC-XY Run > Tooling Query`

![1540441306919](http://salesforcexytools.com/images/xytools_images/1540441306919.png)
Auto config salesforce ant-migration-tools and Backup Metadata

# Page Link
[Auto config salesforce ant-migration-tools and Backup Metadata](http://salesforcexytools.com/SalesforcexytoolsForSublime/SalesforceXytoolsForSublime-007-Migration-Tool.html)



# Topic

- Use [SalesforceXytoolsForSublime](http://salesforcexytools.com/categories/SalesforcexytoolsForSublime/) To Config ant-migration-tools and backup metadata.

> 1. Auto config ant-migration-tools.
> 2. Backup all salesforce metadata in one click. You do not need to config package.xml !



# Environment

* Set up your `java` and `ant` environment.
* You must install `java` and `ant` before use `ant dataloader`.
* You not need to Install the `dataloader`.
* Make sure you can login your sfdc. Test it : SFDC-XY > Login SFDC

# Auto Config ant-migration-tools

>  Sublime-Menu :SFDC-XY > Migration Tool > Ant Migration Tool

![1539848350521](http://salesforcexytools.com/images/xytools_images/1539848350521.png)

Select `Config Ant Metadata Tool`

![1540431779525](http://salesforcexytools.com/images/xytools_images/1540431779525.png)



# Backup all Metadata

>  Sublime-Menu :SFDC-XY > Migration Tool > Ant Migration Tool
>
>  Select `Backup All Metadata`

![1540431839856](http://salesforcexytools.com/images/xytools_images/1540431839856.png)



It will take some time to backup all sfdc metadata. It will backup to the `sfdc-xy\MetadataBackupTools\backup-metadata\`

![1540432165067](http://salesforcexytools.com/images/xytools_images/1540432165067.png)



>  Tips : It is base on [Ant Migration Tool ](https://developer.salesforce.com/docs/atlas.en-us.216.0.daas.meta/daas/meta_development.htm).



# Schedule Task , Auto Backup sfdc metadata.

You can find ant-migration-tools in `./sfdc-xy/MetadataBackupTools` Folder.

You don't need to config `package.xml`.

Just copy `MetadataBackupTools` and config your **system tasks**

![1539848747628](http://salesforcexytools.com/images/xytools_images/1539848747628.png)



## windows

In **windows**, you can set task like this.

![1539849119939](http://salesforcexytools.com/images/xytools_images/1539849119939.png)

![1539849440133](http://salesforcexytools.com/images/xytools_images/1539849440133.png)



## Unix cron

You can set your cron job in unix/ linux/ mac
Auto config salesforce ant-dataloader and Backup Sobject Data

# Page Link
[Auto config salesforce ant-dataloader and Backup Sobject Data](http://salesforcexytools.com/SalesforcexytoolsForSublime/SalesforceXytoolsForSublime-006-Dataloader.html)



# Topic

- Use [SalesforceXytoolsForSublime](http://salesforcexytools.com/categories/SalesforcexytoolsForSublime/) To Config Dataloader and backup sfdc sobject data.

> 1. Auto config dataloader.
> 2. Backup salesforce sobject data.

# Environment

- Set up your `java` and `ant` environment.
- You must install `java` and `ant` before use `ant dataloader`.
- You not need to Install the `dataloader`.
- Make sure you can login your sfdc. Test it : SFDC-XY > Login SFDC

> Tips : You not need to Install the dataloader, Salesforcexytools integrates with dataloader.

# Auto Config Dataloader

Open Sublime-Menu : SFDC-XY > Dataloader > Build Ant Dataloader Configuration

![1539931429520](http://salesforcexytools.com/images/xytools_images/1539931429520.png)



Select `Your Sobjects` and  Select `Start To Config`, example:

![1539931785518](http://salesforcexytools.com/images/xytools_images/1539931785518.png)



You can find **AntDataloader** in `./sfdc-xy/AntDataloader` Folder.

![1539931980132](http://salesforcexytools.com/images/xytools_images/1539931980132.png)



# Run AntDataloader

## Ant command

```
cd ./sfdc-xy/AntDataloader
ant
```



![1539932235973](http://salesforcexytools.com/images/xytools_images/1539932235973.png)



## Run in sublime

`Dataloader > Run Ant Dataloader`
The data will be export to `/sfdc-xy/AntDataloader/Export_YYYYMMDD_HHmm`

![1539932182175](http://salesforcexytools.com/images/xytools_images/1539932182175.png)



# config your soql

Open `./sfdc-xy/AntDataloader/build.xml`

Add your `export` task, you can export sfdc sobject data easily.

```xml
    <target name="start_export">
        <!-- <export file="{FILE_NAME}" object="{SOBJECT_NAME}" soql="{SOQL}"/> -->
        <export file="Blog__c" object="Blog__c" soql="SELECT Id , Name , Title__c, Body__c FROM Blog__c"/>
        <export file="Log__c" object="Log__c" soql="SELECT Id , Name, Body__c FROM Log__c"/>
    </target>
```



> Tips:  Config the `build.xml` and copy `Ant Dataloader` to anywhere, and add your schedule job to export sfdc data.



# Schedule Task , Auto Backup sfdc sobject data.

copy `./sfdc-xy/AntDataloader` To any folder. and schedule task.
Kotlinでデザインパターン(Adapter編)

[Java言語で学ぶデザイン・パターン入門](https://www.amazon.co.jp/%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82%E7%89%88Java%E8%A8%80%E8%AA%9E%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E5%85%A5%E9%96%80-%E7%B5%90%E5%9F%8E-%E6%B5%A9/dp/4797327030/ref=sr_1_1?ie=UTF8&qid=1454743284&sr=8-1&keywords=java%E8%A8%80%E8%AA%9E%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E5%85%A5%E9%96%80)をもとにKotlinで書いてみる

今回はAdapter シリーズとして不定期に更新していく予定

## Adapterパターンとは
すでに`提供されているもの`と`必要なもの`を埋め合わせるもの
本書ではノートパソコンのACアダプターを紹介しています。
つまり、ACアダプターは`直流(提供されているノートPCの電源)`と`交流(必要としているコンセントからの電源)`を埋め合わせするわけですね。
本書ではACアダプターの例は出しているものの、その例で実装はされていなかったのでKotlinで書いてみました。

## Adapterパターンの流れ

![スクリーンショット 2018-10-29 23.46.32.png](https://qiita-image-store.s3.amazonaws.com/0/260353/c9c9d9b4-a52f-110e-93da-b76bcbcbec5c.png)

### Target(対象)
要求されているメソッド (インタフェース)
今回はVolt.kt

```kotlin:Volt.kt
interface Volt {
    var volt: Float
}
```

### Adaptee(適合される側)
既存のメソッド このメソッドの機能をTargetのインタフェースに適合させ利用
今回はDirectCurrent.kt (直流)

```kotlin:DirectCurrent.kt
class DirectCurrent(override var volt: Float) : Volt
```

### Adapter(適合させる側)
Adapteeのメソッドを、Targetから利用できるものに変換する
今回はHas-a関係で実装しており、ACAdapter.ktが該当
ここで要求しているノートPCの直流値から交流へ変換し、どれくらいコンセントからの交流電源が必要か計算している

```kotlin:ACAdapter.kt
class ACAdapter(private var dc: DirectCurrent) : Volt {
    override var volt: Float
        get() = convertDCToAC(dc.volt)
        set(value) {}

    /**
     * Suppose x^2 / 2
     */
    private fun convertDCToAC(v: Float) = v * v / 2

    fun show() {
        Log.d(ACAdapter::class.java.name, volt.toString())
    }
}
```

### Client(利用者)
Targetのメソッドを利用して処理を行う
今回はAndroid Studio上で書いているのでMainActivity.kt
onCreate中の処理

```kotlin:MainActivity.kt
val ac = ACAdapter(DirectCurrent(12.0F))
ac.show()
```

#### ログ結果
```kotlin
D/ACAdapter: 72.0
```

うまく、既存の直流12Vを交流72Vに変換できました。
レポジトリは[こちら](https://github.com/sudo5in5k/gof)
VSCodeでHaxe開発環境整える

大したことしないけどHaxe使ってみたかったので普段使ってるVSCodeでHaxe開発環境整えてみたのでメモ

## Haxeインストール
まずはWindows版Haxeを[公式](https://haxe.org/download/)からダウンロードし、インストール

## VSCode用拡張機能追加

VSCodeの拡張機能:MARKETPLACEから`Haxe`キーワードで検索して、以下をインストール

- [Haxe](https://github.com/vshaxe/vshaxe)
- [Haxe Extension Pack](https://github.com/vshaxe/vshaxe-extension-pack)

## haxelib最初に使うとき

``` bash
# 以下、公式のパスと違うけど自分の環境では以下になっていたためそのまま指定。
$ sudo mkdir -p /usr/share/haxe
$ sudo chown -R {username} /usr/share/haxe
$ sudo haxelib setup
```

## React使いたいので入れる

- [haxe-react](https://github.com/massiveinteractive/haxe-react)

``` bash
# 以下コマンドでhaxe-reactをインストール
$ haxelib install react
```
MacOS High Sierraでpythonコマンドのバージョンをpython3にする

# Macでpythonコマンドでpython3を利用する

macを買ってはじめに設定することの一つです。

## 動機

python2系は2020年にEnd of Lifeを迎え、メンテナンスされなくなります。新規に利用する際にはよほどの理由がない限りはpython3系を利用するのが良いでしょう。
一方、2018年現在Macbook Proを購入するとデフォルトではpython2系で実行されます。いちいちコマンドでpython3と打つのは面倒臭いため、macを新調したらpythonコマンドでpython3を呼ぶように最初に設定しておきます。

## 環境

手元の環境は以下のMacOSですが、Mojaveでもpython2.7がデフォルトで呼ばれるため有効です。(そろそろバージョンアップしよう)

```bash
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.13.3
BuildVersion:	17D47
```

## バージョンの確認

```bash

$ python --version
Python 2.7.10
$ python3 --version
Python 3.6.5
```

## 対処方法

pythonを呼んだ時にpython3が呼ばれるようにaliasします。

```bash

$ alias python=python3
$ python --version
Python 3.6.5
```

## 恒久化方法

`~/.bashrc` にaliasコマンドを記載しておくと、対話シェルを開く際に毎回aliasコマンドが実行されるため、何も気にしなくてもpython3が呼ばれるようになります。

```bash
echo 'alias python=python3' >> ~/.bashrc
```

## その他

### aliasは絶対Pathで書かない

だいたいなんでも絶対Pathで記述した方が良いと思って以下のように書いていると、virtualenvで意図しない動作になります。

```bash:悪い例
$ alias python=/usr/local/bin/python3
```
忙しい人のための機械学習　AI・機械学習・ディープラーニングの違い編

AI・機械学習ディープラーニングという言葉は今では聞いたことないって人はほとんどいないくらいに流行しているワードです。
でもじゃあAIってなんなの？
機械学習とディープラーニングって何が違うの？
って聞かれたときに回答できない人のための記事です。
忙しい人のためにそれぞれの概要と簡単な例をまとめました。

#1. AIと人工知能とディープラーニングの違い

![image.png](https://qiita-image-store.s3.amazonaws.com/0/162114/98662abe-10d6-cbd7-6b23-5d62cfab65c0.png)

まず初めにAIと機械学習とディープラーニングの違いについて纏めます。

簡単に説明するとAIという分野の中に機械学習というカテゴリがあります。
そして機械学習の手法の一つにディープラーニングというものがあるわけです。
AI＞機械学習＞ディープラーニング。

野球で例えるなら
AI＝「野球選手」
機械学習＝「バッター」
ディープラーニング＝「一本足打法」
みたいな感じです。

#2.　AIの概要
次にAIという言葉の概要について説明します。
AI(Artificial Intelligence)という言葉は1956年に誕生した言葉です。
最近流行りだしたのでもっと新しいワードかと思いますが、意外と歴史がある単語です。
昔のAIは迷路やパズルなど、ルールや方法が明確な条件下で次の一手を考えられるというものであまり実用化には向いていなかったそうです。
昔から将棋や囲碁のゲームってありましたがあれの対戦相手もAIと呼べるわけです。

2018年現在ではAIは探索や推論、知識表現、そして機械学習など様々な用途で使われるようになっています。

#3.　機械学習の概要
機械学習とは細かいことを気にせずザックリ言うと
与えられたデータから何かしらの法則を見す作業を行うことです。
機械学習については人によっては違う意見があると思いますが、下記のように3つに分類することができます。
今回はこの中でも特に直感的にわかりやすい教師あり学習について説明します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/162114/cc223741-2f67-0f96-427c-d573a48bc037.png)

##3.1　教師あり学習

教師あり学習とは与えられた条件と結果のセットから法則を見出す方法です。

例えば、インフルエンザに感染しているかを判断する機械学習するとします。
まず、過去の事例から風邪にかかった人の特徴を機械に学習させます。
「こういう特徴のある人は風邪をひいてるんだよー」って教えてあげる感じです。

機械が風邪の特徴を学習できたなら風邪を引いたかもしれない人の特徴を機械に教えます。
すると機械は学習した特徴を元にしてその人が風邪をひいているのかどうかを判断します。
これが機械学習の一例です。

#4．ディープラーニングとは

いよいよ深層学習とも呼ばれるディープラーニングについての解説です。

ディープラーニングは機械学習で特徴を学ぶ際に使用する学習方法です。
例えば、機械学習の説明の際にに機械が風邪をひいた人の特徴を学んでいましたが、
実際にはどうやって学んでいたのでしょう？
学習の際には人が風邪をひいた人の特徴を洗い出して機械に教え込む必要がありました。

- 熱が出ている人は風邪をひいている可能性が高い
- 患者の好きな食べ物のデータもあるけどこれは関係なさそうだから計算から除外しよう
- 咳が出るのは風邪の症状だから特徴として覚えさせよう

なんてことを人間が考えて入力する必要がありました。
でもこういう特徴の選択って大変な作業ですよね。
この特徴の選択を機械が自動的にしてくれる技術こそがディープラーニングなのです！

詳しい内容は別の記事に譲りますが、ニューラルネットワークという人間の脳の構造を真似した仕組みを使って与えられた大量のデータから必要なものを選択することができます。
下の図がニューラルネットワークの説明でよく出てくる図です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/162114/ba67259e-32a7-9523-df6b-cd16ebb4259e.png)
意味は分からなくていいですが、入力層、中間層、出力層に分かれています。
このようにいくつもの"層"を使って学習することから"深層学習"と呼ばれるわけです。
このディープラーニングの登場によって特に画像、音声認識の分野は飛躍的に向上し、AIは現在注目される技術となったといっても過言ではないでしょう。

#5.まとめ

- AI < 機械学習 < ディープラーニング
- 機械学習には教師あり学習、教師なし学習、中間的学習がある
- ディープラーニングは特徴量の選択が自動で行われる機械学習の1手法
オブジェクトの名前にメッシュ名を合わせる (Python for Blender クックブック)

# オブジェクトの名前にメッシュ名を合わせる
Pythonを使ってBlenderでできる事をまとめています。解説もあります。

[はじめに](https://qiita.com/KTakahiro1729/items/5de5f60982af37d23aa0)
[レシピ一覧](https://qiita.com/KTakahiro1729/items/57f4e1f5495c5e54d431)

Pythonの難易度: ★★☆☆☆

### 動機
オブジェクトの名前を変更しても、メッシュの名前までは変わりません。
いちいち変えるのも面倒くさいので、Pythonにやってもらいましょう。

### 細かい仕様
- 様々な種類のオブジェクト（メッシュ、ランプ、カメラなど）があるファイルを使ってください。
- 一つのメッシュデータが複数のメッシュオブジェクトに共有されている状態は考慮しなくてもいいです。
- メッシュオブジェクトの中のメッシュデータの名前を、メッシュオブジェクトと同じにしてください。


## サンプルコード

```python
import bpy
for obj in bpy.data.objects:
  if obj.type == "MESH":
    obj.data.name = obj.name
```


上記サンプルコードを、Blender内蔵のテキストエディタに貼り付けた後、<kbd>Alt</kbd>-<kbd>P</kbd>を実行してください。

## 解説
### `bpy.data.objects`
PythonからBlenderを使うには`bpy`というライブラリを使います。
例えば、`bpy.ops`には編集のための関数が格納されています。

`bpy.data`にはBlender内の様々な変数（オブジェクトのインスタンス）が格納されています。
オブジェクト一覧は`bpy.data.objects`から、マテリアル一覧は`bpy.data.materials`からアクセスできます。
この一覧の型は`bpy.types.bpy_collections`であり、この型は辞書とリストを合わせたようなものです。[^1]
[^1]: bpy.data.objectsの型が`bpy_collections`と説明しましたし、typeやisinstanceを使ってもその通りですが、実際には`bpy.types.BlendDataObjects`です。この辺りはどうやってるんだろう……

実際、`list(bpy.data.objects)`や`dict(bpy.data.objects)`のように型を変換して`print`すると、見やすい形で出力されます。

今回はfor文で1つずつアクセスしています。


### obj.typeについて
オブジェクトには、カメラやメッシュオブジェクトなど様々な種類があり、`obj.type`にその種類が格納されています。例えば、スタートアップファイルで

```python
for obj in bpy.data.objects:
  print(obj.type)
```

を実行すると、

```console
CAMERA
MESH
LAMP
```

を出力します。

今回は、メッシュオブジェクトのメッシュを変更したいので、`obj.type == "MESH"`を条件にします。

### obj.data
`obj.data`は上記の`obj.type`に応じて、様々なものが入っています。
`obj.type == "MESH"`なら`obj.data`にはメッシュの実体が入っています。

このメッシュの型は`bpy.types.Mesh`ですので、サンプルコードは

```python
import bpy
for obj in bpy.data.objects:
  if obj.type.data == bpy.types.Mesh:
    obj.data.name = obj.name
```

と書き換えることも出来ます。

### .name
オブジェクトなどの名前を手に入れたり、変更したり出来ます。
これを変更するとアクセスが不便になるので、辞書型で変更を保存しておくと良いかもしれません。
Export Sobject to Excel and Search Sobject

# Page Link
[Export Sobject to Excel and Search Sobject](http://salesforcexytools.com/SalesforcexytoolsForSublime/SalesforceXytoolsForSublime-004-Sobject.html)



# Topic

* Use [SalesforceXytoolsForSublime](http://salesforcexytools.com/categories/SalesforcexytoolsForSublime/) To Build Salesforce Deploy Package

> 1. Search sobject and view data
> 2. Export Sobject Schema To Excel.
>
>

# Environment

- Make sure you can login your sfdc. Test it : SFDC-XY > Login SFDC


# Sobject

## Open SObject Manager Page

`SObject > Search Sobject(Browser)`

![1540435396263](http://salesforcexytools.com/images/xytools_images/1540435396263.png)

Search the sobject, then it will open the sobject manager page in browser.

![1540435427892](http://salesforcexytools.com/images/xytools_images/1540435427892.png)

![1540435595332](http://salesforcexytools.com/images/xytools_images/1540435595332.png)

## View SObject Data In Browser

`SObject > Open Sobject Data View(Browser)` 

![1540435631881](http://salesforcexytools.com/images/xytools_images/1540435631881.png)

Search the sobject, then it will open the data manager page in browser.

![1540435726045](http://salesforcexytools.com/images/xytools_images/1540435726045.png)

## Export Sobject Schema To Excel

`Sobject > Export Sobject Schema To Excel`

![1539935245815](http://salesforcexytools.com/images/xytools_images/1539935245815.png)

Example,

![1539935461910](http://salesforcexytools.com/images/xytools_images/1539935461910.png)



## Export SObject List To Txt

`Sobject > Show Sobject List `

![1540435947703](http://salesforcexytools.com/images/xytools_images/1540435947703.png)

## Export SObject Data To Txt

`Sobject > Export Sobject Data `

![1540436013078](http://salesforcexytools.com/images/xytools_images/1540436013078.png)

![1540436160738](http://salesforcexytools.com/images/xytools_images/1540436160738.png)

# summary
## SObject

`SObject > Search Sobject(Browser)`
`SObject > Open Sobject Data View(Browser)` 
`Sobject > Export Sobject Schema To Excel`
`Sobject > Show Sobject List `
`Sobject > Export Sobject Data `
[Laravel 5.7] Eloquent リレーションテーブル間で timestamps を連携する方法

## できること

子のモデルが更新されたタイミングで親のモデルのtimestampsも自動更新する。

#### 参考
公式ドキュメント `Eloquent: Relationships > Touching Parent Timestamps`
https://laravel.com/docs/5.7/eloquent-relationships#touching-parent-timestamps

#### 2018.12.5 追記
5.7のドキュメントと比較したところ、特に変わったところはないようなので↑のURLを5.7に書き換えました。

## 方法

`belongsTo` もしくは `belongsMany` で親のモデルと紐づいている子のモデルに `touches` プロパティを設定する。
こうすれば、子の更新タイミングで親のtimestampsも自動更新することが可能。

### 例

```php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Comment extends Model
{
    protected $touches = ['post'];

    public function post()
    {
        return $this->belongsTo('App\Post');
    }
}
```

こんな感じで `touches` プロパティをつけておけば、 `Comment` が更新されると `Post.update_at` も同じように更新される。便利。
pythonのエラーと例外

#はじめに
pythonの基礎として、エラーと例外について記載していきます。

#構文エラー
構文自体が誤っている場合は構文エラーが出力されます。

```python
>>> while a<3
  File "<stdin>", line 1
    while a<3
            ^
SyntaxError: invalid syntax
```

パーサーはエラーの発生している行を示し、エラーが検出された最初の位置を^で示します。


#例外
構文として正しくても実行中に発生するエラーを例外と言います。

```python
>>> 1/0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
``` 
```python
>>> abc*3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'abc' is not defined
```
```python
>>> "abc"+2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: must be str, not int
```

#例外の処理

例外を選別して処理することができます。

```python
try:
    例外が発生する可能性がある処理
except 例外クラス名:
    例外が発生した場合の処理
else:
    例外が発生しなかった場合の処理
finally:
    例外が発生してもしなくても実行する処理
```


まず、tryとexceptの間処理が実行されます。
例外が発生しなければtry文は終了し、例外が発生するとexceptの後に移動、指定されている例外に一致する場合はexcept（ハンドラー）が実行されます。
もしexceptと一致しない場合は、例外エラーが出力されます。
※複数のハンドラーを指定することができます。 exceptでは複数の例外をタプルにして渡すことができます。
※外から呼び出されたユーザー定義関数の内部で発生した例外の処理も行います。


#elseとfinally

try-exceptでは、elseを設けることができます。 例外が発生しなかった時に実行されるコードを書くのに使います。
elseは、全てのexceptよりも後ろに置かなければなりません。 
またfinallyは「例外の発生に関係なく、最後に処理を実行します。

```python
>>> try:
...     a = 10 / 0
...     print("{0}".format(a))
... except ZeroDivisionError:
...     print("ZeroDivisionError!!")
... else:
...     print("else statement")
... finally:
...     print("finally statement")
... 
ZeroDivisionError!!
finally statement
```

```python
>>> try:
...     a = 10 / 1
...     print("{0}".format(a))
... except ZeroDivisionError:
...     print("ZeroDivisionError!!")
... else:
...     print("else statement")
... finally:
...     print("finally statement")
... 
10.0
else statement
finally statement
```

#raise

raiseを使うと特定の例外を発生させることができます。

```python
>>> raise NameError('error!')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: HiThere
```

発生させたい例外を発生させたい箇所に記述し
except句の中でraise と記述することで例外を返すこともできます。

いい例が思いつかなかったので[こちら](https://qiita.com/Usek/items/53527feba2adcb386aa8)を参照にしました。

```python
>>>try:
...    raise NameError('HiThere')
>>>except NameError:
...    print('An exception flew by!')
...    raise
```



#終わり
スポーツをITする（２）フォームチェックの前段階 tensoleflow.js

[前回の記事](https://qiita.com/Chishiki/items/ecbca5be4a6a8275159b)から、スマフォカメラを使って、映像の上にボーンを重ねる実験を行いました。
i
phone8 Safariブラウザです。

## HTML
tfjs posenetのdemos camera.htmlに、横幅170pxのcanvasを追加。
Videoタグ、Canvas id=output のwidthともに、js側で横340px、縦240pxにします。

```
<video id="video" playsinline style=" -moz-transform: scaleX(-1);
-o-transform: scaleX(-1);
-webkit-transform: scaleX(-1);
transform: scaleX(-1);
display: none;">
</video>
<canvas id="output"></canvas>
<canvas id="canvas" width="170" height="240"></canvas>
```

## CSS
追加したcanvasが、映像の中央に来るように調整。

```
#canvas{
  position: absolute;
  left: 85px;
  top: 0;
  background-color: yellow;
  opacity: 0.4;
  z-index:100;
}
```

## Javascript
追加したcanvasに、あらかじめ取得したボーン座標を描画します。
実は、tensoleflow.jsで取得した座標には、少しズレがあったので、learnOpenCVのOpenPoseImage.pyで出力しました。tfjsのposebetに合うよう、JSONを生成するように改修しています。

```
const canvas_t = document.getElementById('canvas');
const ctx_t = canvas_t.getContext('2d');
ctx_t.clearRect(0, 0, 170, 240);

let poses = [];

// Head – 0, Neck – 1, Right Shoulder – 2, Right Elbow – 3, Right Wrist – 4,
// Right Knee – 9, Right Ankle – 10, Left Hip – 11, Left Knee – 12,
// Left Ankle – 13, Chest – 14, Background – 15

var template_pose = {"score": 1,
"keypoints":[
	{"score":1, "part":0, "position": {"x":81.30434782608695,"y":15.652173913043478}},
	{"score":1, "part":1, "position": {"x":81.30434782608695,"y":46.95652173913044}},
	{"score":1, "part":2, "position": {"x":66.52173913043478,"y":52.17391304347826}},
	{"score":1, "part":3, "position": {"x":73.91304347826087,"y":83.47826086956522}},
	{"score":1, "part":4, "position": {"x":88.69565217391305,"y":114.78260869565217}},
	{"score":1, "part":5, "position": {"x":103.47826086956522,"y":41.73913043478261}},
......
]
};

poses.push(template_pose);

poses.forEach(({score, keypoints}) => {
	  drawKeypoints(keypoints, ctx_t);
	  drawSkeleton(keypoints, ctx_t);
});
```

## 結果
夜だったので、背景はPC映像でご勘弁を。近々に外で実際のゴルフのアドレスで試してみて、この記事の整理と所感を記載します。端折った内容ですみません。
![IMG_0397.jpg](https://qiita-image-store.s3.amazonaws.com/0/74852/4951636d-f961-12bb-72ad-c0163a129dd1.jpeg)
＊estimateSinglePose()には、映像反転を制御するflipHorizontalがありますが、iOS Safariでtrueにしてもfalseにしても、反転したままなのです。。なぜ？
　↓
flipHorizontalは、特徴点を反転させるようで、映像自体の反転ではないようです。
detectPoseInRealTime(video, net)関数の中のflipHorizontalをfalseとし、

```
if (guiState.output.showVideo) {
    ctx.save();
    //ctx.scale(-1, 1);
    //ctx.translate(-videoWidth, 0);
    ctx.drawImage(video, 0, 0, videoWidth, videoHeight);
    ctx.restore();
}
```
とscaleとtranslateをコメントアウトしたら、うまく動作しました。いいのかな。



## 次は
どのくらい離れれば実際の映像に合うのかどうか。
もっと大きな映像にしたいのですが、やり方を模索中。。
フォーム判定のロジック組み込み。
WordPress in AppEngine SE でのプラグイン管理

# この記事の目的

* AppEngine Standard Environment(SE)上でWordpressを動かす際のプラグイン管理方法の紹介

# 動作環境

* PHP 7.2.9
* Google Cloud SDK 220.0.0
* Wordpress 4.9.8

# 本題

AppEngine SEでWordPressを開発・デプロイのベース作成には[WordPress on App Engine Standard for PHP 7.2](https://github.com/GoogleCloudPlatform/php-docs-samples/tree/master/appengine/php72/wordpress) を使いました。

本題のプラグイン管理についてですが、AppEngineはapp.yamlという設定ファイルがあるディレクトリをルートディレクトリとして、それ以下にあるファイルを全てまとめてAppEngine上にデプロイします。
そのファイル群+オプションでいくつかのPHP Extensionsによってアプリケーションを構成するため、デプロイ時にはデプロイを実行する環境にWordPressのコアファイル及びプラグインを含めたファイルが全て存在する必要があります。
プラグインを全てリポジトリに含めることも出来なくはないですが、サイズとメンテナンス性の観点から取りたくない方法なので、どのプラグインのどのバージョンを利用しているのかのみを管理します。

プラグインをコード管理したい場合に`WP-CLI`を使ってインストールとアクティベートを自動化する方法もありますが、AppEngine SEではローカルファイルの書き込みができないため、この方法はとれません。
なので、今回はcomposerを使って、開発/デプロイ時にプラグインをインストールする方法をとります(プラグインのアクティベートはデプロイ後にWordpressの管理画面から行います)。

## composerによるWordPressプラグインの管理

composerでWordPressのプラグインを管理するためには[WordPress Packagist](https://wpackagist.org/)を使います。
WordPress Packagistはプラグインをホスティングしているリポジトリで、これをcomposerのrepositoriesに追加することで管理を可能にします。
以下がcomposer.jsonのサンプルです。`repositories`プロパティに`https://wpackagist.org`を追加していて、`require`プロパティで必要なプラグイン(例）を指定しています。

```json:composer.json
{
  "name": "sample",
  "authors": [
    {
      "name": "author",
      "email": "sample@example.com"
    }
  ],
  "repositories": [
    {
      "type": "composer",
      "url": "https://wpackagist.org"
    }
  ],
  "minimum-stability": "dev",
  "require": {
    "wpackagist-plugin/addquicktag": "2.5.*",
    "wpackagist-plugin/advanced-custom-fields": "5.7.*",
    "wpackagist-plugin/all-in-one-seo-pack": "2.9.*",
    "wpackagist-plugin/gcs": "0.1.4",
  }
}
```

これらのプラグインは`wp-content/plugins`ディレクトリにインストールされます。
`vendor`ディレクトリにインストールされないのは、これらが`type:wordpress-plugin`を指定されているためで、composerはこのtypeのパッケージのインストール先をデフォルトで`wp-content/plugins`に指定します。
これはその他のFW等でも適用されていることもあり、詳しい説明は[こちら](https://getcomposer.org/doc/faqs/how-do-i-install-a-package-to-a-custom-path-for-my-framework.md)に書かれています。
インストール時のプラグインのパッケージ名称は

- WordPress Packagistから検索する
- [WordPressプラグインの一覧](https://plugins.svn.wordpress.org/)から探す

などで探してみてください。
[WEX FC] クロール詳細ログの確認方法

#概要
WEX FCのクロールのログは、SQLite databaseに保管されているため、SQLite専用ビューアを使用する必要があります。
DB Browser for SQLiteを使用してログを参照する例を紹介します。

#手順
###1. DB Browser for SQLite のセットアップ

こちらを参考にセットアップ。
[DB Browser for SQLiteのダウンロードとインストール](https://www.dbonline.jp/sqlite-db-browser/install/index1.html)

###2. ログディレクトリの確認
WEX FC管理画面の
コレクション＞Configuration＞Meta＞Filebase
からログディレクトリを確認
![image.png](https://qiita-image-store.s3.amazonaws.com/0/248948/67d3f2ed-0a17-a1fb-cee5-c4de797842fd.png)

###3. ログファイル（log.sqlt）の取得
《Filebaseディレクトリ》/《crawl1 or crawl0》/log.sqlt
を確認

###4. ログファイルのオープン
ログファイルをDB Browser for SQLiteで開く
クロールのエラー発生状況はcrawled/errors_summary/errorsで確認可能
![image.png](https://qiita-image-store.s3.amazonaws.com/0/248948/fc22e2f2-13c7-6f7a-38cc-dbde47c2850d.png)

以下の例ではコンバータでエラーが発生していることがわかる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/248948/2a58c8c6-6e66-3746-ed80-7f4c56f6dfc4.png)

以上です。
transmit5からVPSにSFTPする時に引っかかった注意点

少し戸惑ったのでメモ書き程度ですが、共有します。

##今回の環境
Mac / transmit5 / VPS CentOS (userを作っている) / ssh / port指定あり
です。
※CentOSじゃなくても同じだと思います。
※(userを作っている)というのは、 VPSをする人は、ほとんどが、rootでログインすることはなく、ユーザーを作ってログインしていると思います。

##動機
さくらのVPSでCentOS7にsshでログインして操作しているのですが、データをいちいちSCPするのが面倒なので、接続も良好なtransmit5でログインしようと思ったため

##ログイン方法

```
transmit5を起動し、クイックコネクトでSFTPを選択し、
・自分のurl
・portを指定
・ユーザ名(VPSにログインする)
・パスワード（こちらが不要でした）
・鍵マークからmacの　.sshの秘密鍵を指定（パスフレーズも記述）
```

必要事項を埋めたつもりだったのですが、接続できませんでした。

ちょっと考えてみると？
普段terminalで、sshするときは

```
ssh -p [port] [user]@[url]
```

そのあと

秘密鍵公開鍵のあらかじめ決めておいたパスフレーズ

なので、パスワードはいりませんでした！

これで接続しようとするとパスフレーズを求められたので、入力すると無事にログインできました。

ということで、VPSのユーザーパスワードは不要ということです。
PROCESSMAKER4.1

プロセスメーカ４．１でのＬＡＲＡＶＥＬの開発

https://github.com/ProcessMaker/bpm/tree/develop/ProcessMaker

プロセスメーカー（ＢＰＭＳ）がＬＡＲＡＶＥＬを採用
　
今までフレームワーク部分でいろいろといわれてきたので
これをもとに１から　作成に関わっていく
CakePHP3でリバースプロキシ経由のアクセスだとCake\Routing\Router::urlのアドレスがプライベートIPになる

開発環境では起こらなかったのですが、本番にデプロイしたところURLがプライベートIPになってしまいました。

### 問題のコード
```php5:src/Template/Layout/default.ctp

$this->assign('requestFullUrl', \Cake\Routing\Router::url(NULL, true));
```

テンプレートでCake\Routing\Router::urlを使ってカレントのURLを取得していました。
このURLをog:urlなどに設定していたのですが、本番でプライベートIPアドレスになったのでFacebookでシェアされた時にリンク切れになってしまいました。

### 原因調査
CakePHPのコードを見てみるとこちらのコードになっていました。

```php5:vendor/cakephp/cakephp/src/Routing/Router.php

    public static function url($url = null, $full = false)
    {
        ...

        if (empty($url)) {
            $output = isset($here) ? $here : $base . '/';
            if ($full) {
                $output = static::fullBaseUrl() . $output;
            }

            return $output;
        }
```
static::fullBaseUrl()という関数が呼び出されていて、ここに正しいドメインが指定できれば良さそうです。
更にコードを追ってみると。

```php5:vendor/cakephp/cakephp/src/Routing/Router.php
...
    /**  
     * Contains the base string that will be applied to all generated URLs
     * For example `https://example.com`
     *
     * @var string
     */
    protected static $_fullBaseUrl;
...
    public static function fullBaseUrl($base = null)
    {   
        if ($base !== null) {
            static::$_fullBaseUrl = $base;
            Configure::write('App.fullBaseUrl', $base);
        }
        if (empty(static::$_fullBaseUrl)) {
            static::$_fullBaseUrl = Configure::read('App.fullBaseUrl');
        }

        return static::$_fullBaseUrl;
    }
```
static::$_fullBaseUrlが空の時、config/app.phpファイルのApp.fullBaseUrlを代入するになってました。

### 解決方法
なので、下記の箇所を修正

```diff:config/app.php

    'App' => [
         'namespace' => 'App',
         'encoding' => env('APP_ENCODING', 'UTF-8'),
         'defaultLocale' => env('APP_DEFAULT_LOCALE', 'ja-JP'),
         'base' => false,
         'dir' => 'src',
         'webroot' => 'webroot',
         'wwwRoot' => WWW_ROOT,
         // 'baseUrl' => env('SCRIPT_NAME'),
-        'fullBaseUrl' => false,
+        'fullBaseUrl' =>  env('PROTOCOL', 'http')
+            . '://'. env('DOMAIN', 'localhost:8888'),
         'imageBaseUrl' => 'img/',
```

### 余談

念の為リファレンスを確認してみると下記のことが書かれています。
https://book.cakephp.org/3.0/ja/development/configuration.html

> App.fullBaseUrl
> アプリケーションのルートまでの (プロトコルを含む) 完全修飾ドメイン名です。 これは完全な URL を生成する際 に利用されます。デフォルトでは、この値は $_SERVER の環境情報から生成されます。しかし、パフォーマンスを最適化したり、 他人が Host ヘッダーを操作するのを心配するならば、自分で指定すべきでしょう。CLI 環境 (シェル) ではウェブサーバーとの関連が無いので fullBaseUrl を $_SERVER から読むことができません。もしシェルから URL を作成する必要がある場合 (例えばメールの送信) 、自力で指定する必要があります。

想定されていないわけ無いですよね・・・。
ジョブスケジューラーにdockerコマンドを実行させる

例えば、Rを使って、以下のような4×3の行列（testdata.csv）に対して、遺伝子ごとに平均値が0、分散が1になるようにスケーリングした結果を、新たにscaled_testdata.csvとして保存したいとする。

```{bash}
echo ",Gene1,Gene2,Gene3" > testdata.csv
echo "Cell1,2,1,3" >> testdata.csv
echo "Cell2,4,3,6" >> testdata.csv
echo "Cell3,5,4,7" >> testdata.csv
echo "Cell4,4,3,8" >> testdata.csv
```

Rで以下のように実行すれば、目的のものが手に入る。

```{R}
input <- read.csv("testdata.csv")
scaled <- scale(input)
write.csv(scaled, "scaled_testdata.csv", quote=FALSE)
```

この作業を、Sun Grid Engineがある環境で、実行内容を書いたシェルスクリプトをqsubすることで行いたい。
また、特定のバージョンのRやパッケージを使うなどを想定して、dockerコマンドも使う。
手順は以下の通り。

# Step.1 : Dockerコンテナを用意する

[rocker](https://github.com/rocker-org/rocker)を使うと、気軽にRがインストールされたLinux環境が手に入るので、プルして使う。

```{bash}
docker pull rocker/r-base
docker run -i -t rocker/r-base:latest /usr/bin/R -e 'sessionInfo()'
```

R version 3.5.1 (2018-07-02)がインストールされているもよう。

# Step.2 : qsubするシェルスクリプトにdockerコマンドを書く

次に、以下のようなシェルスクリプト（Job.sh）を作成する。

```{bash}
#!/bin/bash

#$ -l nc=4
#$ -q node.q

# which dockerでは/bin/dockerにdockerコマンドあった
/bin/docker run --rm -v /home/antiplastics/Docker:/Docker \
rocker/r-base:latest sh \
-c "/usr/bin/R -e 'input <- read.csv(\"/Docker/testdata.csv\");\
scaled <- scale(input);\
write.csv(scaled, \"/Docker/scaled_testdata.csv\", quote=FALSE)'"
```

ここでは、作業環境が、/home/antiplastics/Dockerだったとして、コンテナ内に/Dockerというディレクトリを作成して、そこでtestdata.csvが触れるように**-v**オプションを使っている（**重要**）。

これをqsubすれば、scaled_testdata.csvが/home/antiplastics/Docker以下に出力される。

```{bash}
qsub Job.sh
```

# Step.3 : アレイジョブで、3回同じ事をする

通し番号1,2,3を設定し、番号ごとに違うことをするべく、アレイジョブでqsubする。
ArrayJob.shというファイルを以下のように書いて、上記と同様、qsubした。

```{bash}
#!/bin/bash

#$ -l nc=4
#$ -t 1-3
#$ -q node.q

mkdir -p /home/antiplastics/Docker/$SGE_TASK_ID

/bin/docker run --rm -v /home/antiplastics/Docker:/Docker \
rocker/r-base:latest sh \
-c "/usr/bin/R -e 'input <- read.csv(\"/Docker/testdata.csv\");\
scaled <- scale(input);\
write.csv(scaled, \"/Docker/$SGE_TASK_ID/scaled_testdata.csv\", quote=FALSE)'"
```

```{bash}
qsub ArrayJob.sh
```

Step.2のJob.shと大体同じだが、
\#$ -t 1-3
というqsubオプションにより、$SGE_TASK_IDに1から3までの値が格納され、各々別々のジョブとして実行される。
これにより、/home/antiplastics/Docker/{1..3}に、別々にscaled_testdata.csvが出力される。
モンテカルロ法による中学生も理解できる円周率の求め方が面白いのでPythonで

# 背景

[![【すげえw】モンテカルロ法による中学生も理解できる円周率の求め方が面白い【物理エンジン】](http://img.youtube.com/vi/dn-RtqY9aCQ/0.jpg)](http://www.youtube.com/watch?v=dn-RtqY9aCQ)
↑クリックすると飛びます

算数が苦手なのでわりと感動した。

# コード

だから試しに書いてみた。

```python:pi.py
from random import random

x = 0
N = 10_000_000
for idx in range(N):
    if random()**2 + random()**2 < 1:
        x += 1
print(4*x/N) # => 3.1416836
```

# 精度について
試行回数に対してあまり精度が出ないことがわかっているらしい。
[モンテカルロ法と円周率の近似計算 | 高校数学の美しい物語](https://mathtrain.jp/montecarlo)

# その他: ライプニッツの公式を用いて算出

```python:
s = 0
for n in range(100_000):
    s += (-1) ** n / (2*n + 1)
print(s*4) # => 3.1415826535897198
```

# その他: チャドノフスキーの公式を用いて算出

```python:
from math import factorial as fac
s = 0
for n in range(2):
    s += ( (-1)**n * fac(6*n) * (13591409+545140134*n) ) / ( fac(3*n) * (fac(n) ** 3) * (640320 ** (3*n+1.5)) )
print(1/(s*12)) # => 3.1415926535897936
```

~~もうこれわかんねぇな~~
LinkedInAPIを使う。

# LinkedInのAPIで何ができるの？
- 結論。大したことはできない。。。


# とりあえずつなげるまで
## appの登録
[ここ](https://www.linkedin.com/secure/developer?newapp=)からアプリを作る![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/308228/9152f830-a275-e492-a210-a1fc4f1f7721.png)

- 適当に設定。とりあえず動かすにはなんでもいいので頑張らない
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/308228/cf4fdfd6-5de1-d64a-e350-c8795428d5cc.png)

- 設定すると「Client ID」と「Client Secret」が払い出されるので、メモっとく
- 「RedirectURL」を求められるのでちゃんと入れる。アプリからLinkedInの認証画面に飛んでOKとなった後に遷移する画面。とりあえず適当にエントリーポイント作っておく。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/308228/1a803c3f-2d6e-ad29-74a7-1746f8923404.png)

## 自分のアカウントでアプリの許可
- CLIENT_IDとREDIRECT_URIを使って、Appの許可を行う。

```
https://www.linkedin.com/oauth/v2/authorization?response_type=code&client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}&state=987654321&scope=r_basicprofile
```

- 許可すると、REDIRECT_URIにcodeパラメータが付与されてリダイレクトされる。

## トークンを取得

```
	  curl -X POST \
	    --data "grant_type=authorization_code" \
	    --data "code={code}" \
	    --data "redirect_uri={REDIRECT_URI}" \
	    --data "client_id={CLIENT_ID}" \
	    --data "client_secret={CLIENT_SECRET}" \
	    "https://www.linkedin.com/oauth/v2/accessToken"

```
- するとトークンが返ってくるので、それを使って各APIをたたく。
- 本当はprofileAPIとか使いたかったが、パーミッションがなくてたたけない。
- パーミッションを追加するには[ここから](https://developer.linkedin.com/partner-programs)いろいろ登録が必要とのこと。審査も必要なので残念。。。

## APIをたたく
- せっかくなので、goで書いておく

```

	reqURL := "https://api.linkedin.com/v1/people/~?format=json"
	token := "{token}"
	req, err := http.NewRequest(
		"GET",
		reqURL,
		nil,
	)
	if err != nil {
		fmt.Println(err)
	}
	req.Header.Set("Authorization", "Bearer "+token)
	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		fmt.Println(err)
	}
	defer resp.Body.Close()

	respBody, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(string(respBody))

```



- こんな感じ
- 本当はつながってるユーザの情報がとりたかったが、いけてない。。。。