Czy blat Technistone może zmieniać kolor przy normalnym kuchennym użyciu ciepłych przedmiotów lub gorących z podkładkami? W przypadku zanieczyszczeń obecnych między polerowaną powierzchnią blatu a ściśle przylegającym ciepłym przedmiotem może nastąpić efekt wprasowania zanieczyszczeń (jak nadruk termiczny w drukarce laserowej). Co z tym zrobić? Wyczyścić blat wycieralną gąbką Jan Niezbędny albo zmywakiem z gąbką. Czysty blat najlepiej zaimpregnować preparatem Bellinzoni Idea Gold/Dark, powstanie polimerowa warstwa ochronna. Do zabezpieczenia zlewozmywaku z technicznego granitu można użyć Block D-70.
wtorek, marca 11, 2014
Fajna butelka do karmienia niemowlaka
Tommee Tippee: w kształcie cyca, z odpowietrzaniem mleka (zapobiega kolce), ze wskaźnikiem temperatury mleka (malinowy: OK, ciemny fiolet: za zimne, różowy: za gorące).
niedziela, lutego 23, 2014
poniedziałek, lutego 17, 2014
Jaki wózek dziecięcy zmieści się w Toyocie Yaris?
Zmieści się Bebetto Luca lub Baby Design Lupo. Oba wózki to 3w1. Kanapę lepiej przesunąć do przodu, gondola lub spacerówka zmieści sie pionowo obok złożonego stelaża (zakładam, że poniżej niego będą zwykłe bagaże). Polecam sklep Mama i Tata w Starych Babicach. Na tygodniu można bez stresu i pośpiechu, z fachową pomocą dokonać wyboru wózka. Można nawet przymierzyć wózek do samochodu. Zaraz obok sklepu jest wygodny parking.
piątek, stycznia 24, 2014
Koszty utrzymania projektów Tibco
Jak uczciwie wystawić biznesowi rachunek za koszty infrastrukturalne? Każdy proces BW i każdy przepływ powinny generować zdarzenia "użycia". Zużycie procesora w zadanym czasie może być wyjęte za pomocą JMX-a. Mierząc czasy poszczególnych zadań i dysponując zużyciem procesora w oknie czasowym je obejmującym można oszacować zużycie procesora przez pojedyncze zadanie. Mając statystki procesora, pamięci, przestrzeni przechowywania danych można obliczyć realne koszty zadań Tibco. Mierząc i analizując czasy trwania procesów (średnia, mediana, percentyle: 90, 95, 99) przez dłuższy okres można ocenić wpływ wdrażanych projektów na pozostałe i wyciągać wnioski, czy dla spełnienia starych SLA konieczne jest zwiększenie zasobów przy uruchamianiu nowych projektów. Mając dokładne dane, biznes wie za co płaci. Kosztowne pod względem infrastruktury projekty można przepisać i przez to zoptymalizować.
czwartek, stycznia 23, 2014
Mała kuchnia
Przestrzeń kuchenna 6,2m^2: meble w lakierze półmatowym, z magic cornerem, cargo, zabudowaną lodówką i zamrażarką, zlewozmywakiem Blanco Subline 500-U, szufladą do segregowania śmieci, zmywarką 60cm, piekarnikiem Amica i płytą indukcyjną Bosch. W szafkach górnych ukryty okap kuchenny Electrolux. Blat Technistone Crystal Beach z okapnikiem.
niedziela, stycznia 19, 2014
Montaż płyty indukcyjnej w blacie z konglomeratu kwarcowego
![]() |
| Elementy szafek, które mogą mieć styczność z gorącymi elementami płyty indukcyjnej obklejamy folią odporną na wysoką temperaturę (np. Globall) |
![]() |
| W otworze blatu po wewnętrznej części kleimy taśmę dwustronną odporną na wysoką temperaturę i o dobrej nośności (np. Pattex Fix 120kg). |
![]() |
| W przypadku standardowych bezramkowych płyt Bosch 60cm odległość klipa od krawędzi otworu to 75mm. |
![]() |
| Przed finalizacją montażu można kombinerkami rozgiąć odrobinę metalowe klipy, aby plastikowa zapinka przeszła z nie za dużym zastosowaniem siły. |
środa, stycznia 15, 2014
środa, stycznia 08, 2014
Rodzinne głosowanie według Gowina
Być może Gowin nie chciał powiedzieć tego wprost, ale parytet głosów przeskalowany do liczności rodziny mógłby poczynić spore zamieszanie na zabetonowanej scenie politycznej. Dwa głosy od jednej rodziny vs. 4 od innej rodziny z dwójka dzieci. Jak rząd nie zaprezentuje sensownego prorodzinnego programu to rozliczą go rodzice dzieci. Trudne rozwiązanie, które jednak spowodowałoby że ludziom by żyło się lepiej.
niedziela, stycznia 05, 2014
Przesuwanie gniazdka w 4 godziny
Wyjmujemy gniazdko, kujemy ścianę, przymierzamy gniazdko. Jeśli pasuje i załatwiliśmy sprawę kabli to czyścimy dziurę w ścianie pędzelkiem, malujemy gruntem Cekol DL-90, suszymy suszarką. Nalewamy wody do miseczki i dodajemy łyżką Ceresit CX5, konsystencja po wymieszaniu powinna przypominać gorący budyń czekoladowy lub czekoladę pitną. Czekamy minutę aż zaprawa zacznie tężeć i szybko zaczynamy ją nakładać - trwardnieje bardzo szybko w 5 minut. Przez krótki okres czasu zaprawa zachowuje się jak plastelina, co należy szybko wykorzystać. Wygodnie zalepiać dziury warstwami. Ceresit CX5 strasznie niszczy gołe ręce, lepiej używać rękawiczek gumowych. Grunt + suszenie, szlifowanie papierem ściernym a potem Cekol A-45/B-45. Na koniec suszenie, szlifowanie, gruntowanie, suszenie i farba.
sobota, stycznia 04, 2014
wtorek, grudnia 31, 2013
niedziela, grudnia 22, 2013
Konfiguracja CRM 2011 przez dbo.ServerSettingsProperties i dbo.DeploymentProperties
ColumnName Value
AcceptInvitationEnabled 1
ActivateNowFlyOutCookieExpireInHours 24
ActiveUserTimeWindowMinutes 60
AddLicensesEnabled 1
AddStorageEnabled 1
AggregationDataExporterDiskSpaceErrorThreshold 500
AggregationDataExporterDiskSpaceWarningThreshold 1000
AggregationDataExporterSqlCommandTimeout 600
AllowDeclarativeWorkflows 0
AllowExternalCode 1
AuthExpirationReminderEnabled 1
AuthExpirationReminderTimeInMinutes 20
BillingCallbackThresholdInMinutes 30
CrmKeyArchivalPollingIntervalInSeconds 43200
CrmKeyGeneratorPollingIntervalInSeconds 60
DbDnsEnabled 0
DifferentialDatabaseBackupIntervalInHours 3
DisableUserInfoClaim 0
EnableTwoDnsRecordsForWebApp 0
ExpireInvitationThresholdInDays 14
ExpireLoginThresholdInMinutes 30
ExpireSignupTokenThresholdInDays 365
FailoverAvailable 0
FileGrowthSize 32
FipsEnabled 0
ForceDirectWebAppDomain 0
ForceDisablePrimarySdk 0
ForceDisableSecondarySdk 0
ForceSecondaryWebAppDomain 0
FullDatabaseBackupExpirationInDays 7
FullDatabaseBackupIntervalInDays 1
GladosThrottleLimit 100
HardLimitBufferSize 5
HardLimitPercentage 150
ImportMaxAllowedFileSizeInMB 8
ImportMaxIISThreadsForUnzip 4
ImportMaxUnzipProcess 50
ImportTimeLimitOnUnzipProcessInSeconds 300
LastAccessTimeCacheFlushMinutes 60
LegacySiteAvailable 0
LicenseIdCountCheckIntervalInMinutes 5
LicenseIdCountHighWaterMark 5000
LicenseIdCountLowWaterMark 2500
LogBackupIntervalInMinutes 10
LongQueryThresholdInSeconds 15
MaxExpandCount 6
MaxNumberOfTaskPerResource 10
MaxReservedNameResetCount 5
MaxResultsPerCollection 50
MaxWaitTimeForAsyncJobsInMinutes 10
MBI_SSL_TimeToLive 24
MetadataCacheSlidingExpirationMinutes 20
MirroringPort -1
MonitoringTimerIntervalInSeconds 300
NFS_2HR_0_COMPACT_TimeToLive 2
NlbEnabled 0
NotificationsPageSize 1000
OrganizationReadyThresholdInHours 6
OrgMirroringEnabled 0
PerformanceAuditEnabled 1
PerformanceDataToKeepInDays 30
PostponeAppFabricRequestsInMinutes 0
PostViaExternalRouter 0
ProvisioningCompletionThresholdInMinutes 30
ProvisioningPollingIntervalInMinutes 1
RequestCompletionAggregationPeriodHours 24
ReservationTimeoutInMinutes 30
ReservedNamesCacheExpiryInMinutes 30
RetrievalUpperLimitWithoutPagingCookie 5000
RouterConnectionLimit 100
SecondaryDnsFailoverUpdateDelayInHours 6
ShowAuthenticationErrors 0
SignInEnabled 1
SignUpEnabled 0
SmtpPort 25
SqlErrorRetryInSeconds 10
StatisticsEnabled 0
StatisticsServiceCacheFlushInterval 4
StatisticsServiceWaitTimeMillis 300000
StorageCalculationEnabled 0
StorageNotificationThresholdPercentage 90
TraceCallStack 1
TraceEnabled 0
TraceFileSize 10
TraceRefresh -1
UpdateWaitingTasksIntervalInSeconds 30
UserInviteEnabled 1
WaitTimeForWebStoreInSeconds 25
ColumnName Value
ActivityFeedFollowLimit 100
AggregateQueryRecordLimit 500
AppUseInProcessSdk 1
AsyncItemsInMemoryHigh 50
AsyncItemsInMemoryLow 20
AsyncJobMaxExecutionTime 60
AsyncJobOrgDatabaseMaintenanceInterval 5
AsyncJobsModuloForNewJobRetrieval 8
AsyncJobsTimerFrequencyMultiplier 2
AsyncJobsToProcessAtOnce 1
AsyncJobsToReturnInSql 10
AsyncJobTimeoutLockedInterval 40
AsyncKeepAliveInterval 60
AsyncMaximumOrganizationConcurrentJobs 2
AsyncMaximumPriority 10
AsyncMaximumRetries 10
AsyncMaximumSelectInterval 60
AsyncMaximumServerConcurrentJobs 5
AsyncMaximumThreadsPercent NULL
AsyncMaximumThreadsPerCPU 5
AsyncMoveToReadyInterval 10
AsyncOverdueCoefficient 2
AsyncPriorityCoefficient 3
AsyncRetryBackoffRate NULL
AsyncScaleGroupDatabaseCleanupInterval 12
AsyncSelectInterval 5
AsyncSelectParallelism 4
AsyncStateStatusUpdateInterval 5
AsyncStateStatusUpdateMaxRetryCount 12
AsyncTimeBetweenRetries 10
AsyncTimeoutLockedInterval 30
AsyncTimeUntilLockExpires 30
AsyncUseInProcessSdk 1
AsyncWaitSubscriptionInterval 1800
AttributeValidationEnabled 1
AutomaticallyInstallDatabaseUpdates 1
AutomaticallyReprovisionLanguagePacks 1
ClaimsEnabled 0
ClaimsSessionSecurityTokenLifetime 24
CustomerUpgradeEnabled 0
DashboardMaximumControlsLimit 6
DumpChartXmlInResponse 0
DupBulkDetectBatchSize 1000
DupMatchcodeLength 1000
DupMatchcodePersistenceInterval 5
DupMaxPublishedRules 5
DupPublishAsyncPollingInterval 100
DupPublishPageSize 250
ETMAsyncCollectInterval 30
ETMEnabled 0
ETMStatisticsUpdateEnabled 0
ETMThrottlingEnabled 0
ExecuteMultipleMaxBatchSize 50
ExecuteMultipleMaxConnectionsPerServer -1
ExecuteMultiplePerOrgMaxConnectionsPerServer -1
IfdInternetAccessEnabled 0
IfdIntranetAccessEnabled 0
ImportBatchSize 1000
ImportBatchTime 1000
ImportContentBufferSize 16384
ImportCountUpdateBatchSize 10
ImportMaxColumnsAllowed 1022
ImportMaxRetryCountForDataTruncation 5
ImportParsedColumnDefaultSize 500
ImportPickListBatchSize 100
IncludeSQLParameterDataInEventLog 1
IsBeta 0
MaintenanceWindowEndTime NULL
MaintenanceWindowStartTime NULL
MapiSyncMaxConnectionsPerServer -1
MapiSyncPerOrgMaxConnectionsPerServer -1
MaxBackgroundSendEmailRequestsPerOrgPerServer -1
MaxBackgroundSendEmailRequestsPerServer -1
MessageProcessorMaximumDepth 4
MessageProcessorMinimumInactiveSeconds 3600
MetadataQueryMaxDepthOfNestedFilters 0
MinFrequencyForGoalRollupJob 24
OfflineSyncMaxConnectionsPerServer -1
OfflineSyncPerOrgMaxConnectionsPerServer -1
OnDemandRollupTimeout 10
OutlookSyncMaxConnectionsPerServer -1
OutlookSyncPerOrgMaxConnectionsPerServer -1
PagingLimit 200
RunAsyncServiceInSafeMode 0
SetMaxBufferPoolSize 1
ShowAuthenticationErrors 1
SolutionsMarketplaceEnabled 1
SqlCommandTimeout 40
SqlConnectTimeout 30
SQMEnabled 0
SystemFilterLimit -1
TotalRecordCountLimit 500
TraceCallStack 1
TraceEnabled 0
TraceFileSize 10
UserFilterLimit -1
AcceptInvitationEnabled 1
ActivateNowFlyOutCookieExpireInHours 24
ActiveUserTimeWindowMinutes 60
AddLicensesEnabled 1
AddStorageEnabled 1
AggregationDataExporterDiskSpaceErrorThreshold 500
AggregationDataExporterDiskSpaceWarningThreshold 1000
AggregationDataExporterSqlCommandTimeout 600
AllowDeclarativeWorkflows 0
AllowExternalCode 1
AuthExpirationReminderEnabled 1
AuthExpirationReminderTimeInMinutes 20
BillingCallbackThresholdInMinutes 30
CrmKeyArchivalPollingIntervalInSeconds 43200
CrmKeyGeneratorPollingIntervalInSeconds 60
DbDnsEnabled 0
DifferentialDatabaseBackupIntervalInHours 3
DisableUserInfoClaim 0
EnableTwoDnsRecordsForWebApp 0
ExpireInvitationThresholdInDays 14
ExpireLoginThresholdInMinutes 30
ExpireSignupTokenThresholdInDays 365
FailoverAvailable 0
FileGrowthSize 32
FipsEnabled 0
ForceDirectWebAppDomain 0
ForceDisablePrimarySdk 0
ForceDisableSecondarySdk 0
ForceSecondaryWebAppDomain 0
FullDatabaseBackupExpirationInDays 7
FullDatabaseBackupIntervalInDays 1
GladosThrottleLimit 100
HardLimitBufferSize 5
HardLimitPercentage 150
ImportMaxAllowedFileSizeInMB 8
ImportMaxIISThreadsForUnzip 4
ImportMaxUnzipProcess 50
ImportTimeLimitOnUnzipProcessInSeconds 300
LastAccessTimeCacheFlushMinutes 60
LegacySiteAvailable 0
LicenseIdCountCheckIntervalInMinutes 5
LicenseIdCountHighWaterMark 5000
LicenseIdCountLowWaterMark 2500
LogBackupIntervalInMinutes 10
LongQueryThresholdInSeconds 15
MaxExpandCount 6
MaxNumberOfTaskPerResource 10
MaxReservedNameResetCount 5
MaxResultsPerCollection 50
MaxWaitTimeForAsyncJobsInMinutes 10
MBI_SSL_TimeToLive 24
MetadataCacheSlidingExpirationMinutes 20
MirroringPort -1
MonitoringTimerIntervalInSeconds 300
NFS_2HR_0_COMPACT_TimeToLive 2
NlbEnabled 0
NotificationsPageSize 1000
OrganizationReadyThresholdInHours 6
OrgMirroringEnabled 0
PerformanceAuditEnabled 1
PerformanceDataToKeepInDays 30
PostponeAppFabricRequestsInMinutes 0
PostViaExternalRouter 0
ProvisioningCompletionThresholdInMinutes 30
ProvisioningPollingIntervalInMinutes 1
RequestCompletionAggregationPeriodHours 24
ReservationTimeoutInMinutes 30
ReservedNamesCacheExpiryInMinutes 30
RetrievalUpperLimitWithoutPagingCookie 5000
RouterConnectionLimit 100
SecondaryDnsFailoverUpdateDelayInHours 6
ShowAuthenticationErrors 0
SignInEnabled 1
SignUpEnabled 0
SmtpPort 25
SqlErrorRetryInSeconds 10
StatisticsEnabled 0
StatisticsServiceCacheFlushInterval 4
StatisticsServiceWaitTimeMillis 300000
StorageCalculationEnabled 0
StorageNotificationThresholdPercentage 90
TraceCallStack 1
TraceEnabled 0
TraceFileSize 10
TraceRefresh -1
UpdateWaitingTasksIntervalInSeconds 30
UserInviteEnabled 1
WaitTimeForWebStoreInSeconds 25
ColumnName Value
ActivityFeedFollowLimit 100
AggregateQueryRecordLimit 500
AppUseInProcessSdk 1
AsyncItemsInMemoryHigh 50
AsyncItemsInMemoryLow 20
AsyncJobMaxExecutionTime 60
AsyncJobOrgDatabaseMaintenanceInterval 5
AsyncJobsModuloForNewJobRetrieval 8
AsyncJobsTimerFrequencyMultiplier 2
AsyncJobsToProcessAtOnce 1
AsyncJobsToReturnInSql 10
AsyncJobTimeoutLockedInterval 40
AsyncKeepAliveInterval 60
AsyncMaximumOrganizationConcurrentJobs 2
AsyncMaximumPriority 10
AsyncMaximumRetries 10
AsyncMaximumSelectInterval 60
AsyncMaximumServerConcurrentJobs 5
AsyncMaximumThreadsPercent NULL
AsyncMaximumThreadsPerCPU 5
AsyncMoveToReadyInterval 10
AsyncOverdueCoefficient 2
AsyncPriorityCoefficient 3
AsyncRetryBackoffRate NULL
AsyncScaleGroupDatabaseCleanupInterval 12
AsyncSelectInterval 5
AsyncSelectParallelism 4
AsyncStateStatusUpdateInterval 5
AsyncStateStatusUpdateMaxRetryCount 12
AsyncTimeBetweenRetries 10
AsyncTimeoutLockedInterval 30
AsyncTimeUntilLockExpires 30
AsyncUseInProcessSdk 1
AsyncWaitSubscriptionInterval 1800
AttributeValidationEnabled 1
AutomaticallyInstallDatabaseUpdates 1
AutomaticallyReprovisionLanguagePacks 1
ClaimsEnabled 0
ClaimsSessionSecurityTokenLifetime 24
CustomerUpgradeEnabled 0
DashboardMaximumControlsLimit 6
DumpChartXmlInResponse 0
DupBulkDetectBatchSize 1000
DupMatchcodeLength 1000
DupMatchcodePersistenceInterval 5
DupMaxPublishedRules 5
DupPublishAsyncPollingInterval 100
DupPublishPageSize 250
ETMAsyncCollectInterval 30
ETMEnabled 0
ETMStatisticsUpdateEnabled 0
ETMThrottlingEnabled 0
ExecuteMultipleMaxBatchSize 50
ExecuteMultipleMaxConnectionsPerServer -1
ExecuteMultiplePerOrgMaxConnectionsPerServer -1
IfdInternetAccessEnabled 0
IfdIntranetAccessEnabled 0
ImportBatchSize 1000
ImportBatchTime 1000
ImportContentBufferSize 16384
ImportCountUpdateBatchSize 10
ImportMaxColumnsAllowed 1022
ImportMaxRetryCountForDataTruncation 5
ImportParsedColumnDefaultSize 500
ImportPickListBatchSize 100
IncludeSQLParameterDataInEventLog 1
IsBeta 0
MaintenanceWindowEndTime NULL
MaintenanceWindowStartTime NULL
MapiSyncMaxConnectionsPerServer -1
MapiSyncPerOrgMaxConnectionsPerServer -1
MaxBackgroundSendEmailRequestsPerOrgPerServer -1
MaxBackgroundSendEmailRequestsPerServer -1
MessageProcessorMaximumDepth 4
MessageProcessorMinimumInactiveSeconds 3600
MetadataQueryMaxDepthOfNestedFilters 0
MinFrequencyForGoalRollupJob 24
OfflineSyncMaxConnectionsPerServer -1
OfflineSyncPerOrgMaxConnectionsPerServer -1
OnDemandRollupTimeout 10
OutlookSyncMaxConnectionsPerServer -1
OutlookSyncPerOrgMaxConnectionsPerServer -1
PagingLimit 200
RunAsyncServiceInSafeMode 0
SetMaxBufferPoolSize 1
ShowAuthenticationErrors 1
SolutionsMarketplaceEnabled 1
SqlCommandTimeout 40
SqlConnectTimeout 30
SQMEnabled 0
SystemFilterLimit -1
TotalRecordCountLimit 500
TraceCallStack 1
TraceEnabled 0
TraceFileSize 10
UserFilterLimit -1
czwartek, grudnia 19, 2013
Wielowątkowość MS CRM Web
Po ustawieniu liczby wątków roboczych dla endpointu HTTP > 1 zaczynają pojawiać się błędy typu:
The Sandbox SDK Listener failed to start.
Source: w3wp.exe (19396)
Endpoint: net.tcp://localhost/CrmSandboxSdkListener-w3wp
Error: System.ServiceModel.AddressAlreadyInUseException: The TransportManager failed to listen on the supplied URI using the NetTcpPortSharing service: the URI is already registered with the service.
Wyjaśnienia Microsoftu są dwa:
http://support.microsoft.com/kb/2785590
http://support.microsoft.com/kb/2833575,
jedno przeczące drugiemu. Albo usługa .NET jest wielowątkowa albo nie jest. W praktyce wygląda to tak, że CRM Web nie jest napisane w sposób bezpieczny dla wielu wątków i przy używaniu wielu workerów co jakiś czas jeden z nich przestaje komunikować się z IIS-em i zostaje zabity. Widać to po stronie klienta jako reset połączenia TCP/IP.
The Sandbox SDK Listener failed to start.
Source: w3wp.exe (19396)
Endpoint: net.tcp://localhost/CrmSandboxSdkListener-w3wp
Error: System.ServiceModel.AddressAlreadyInUseException: The TransportManager failed to listen on the supplied URI using the NetTcpPortSharing service: the URI is already registered with the service.
Wyjaśnienia Microsoftu są dwa:
http://support.microsoft.com/kb/2785590
http://support.microsoft.com/kb/2833575,
jedno przeczące drugiemu. Albo usługa .NET jest wielowątkowa albo nie jest. W praktyce wygląda to tak, że CRM Web nie jest napisane w sposób bezpieczny dla wielu wątków i przy używaniu wielu workerów co jakiś czas jeden z nich przestaje komunikować się z IIS-em i zostaje zabity. Widać to po stronie klienta jako reset połączenia TCP/IP.
środa, grudnia 11, 2013
Call external BW process in mapper
Problem: Consider many records of entity A where enrichment needs process call for every record, decomposition before call and composition after call. This may impose serious performance hit.
Solution: Construct Java Custom Function calling Java Event Starter using LinkedBlockingQueue. Static XPath function pushes container with String argument and another LinkedBlockingQueue for response. Java Event Starter receives container, executes actions using argument and pushes response to container's LinkedBlockingQueue.
Solution: Construct Java Custom Function calling Java Event Starter using LinkedBlockingQueue. Static XPath function pushes container with String argument and another LinkedBlockingQueue for response. Java Event Starter receives container, executes actions using argument and pushes response to container's LinkedBlockingQueue.
BW Smart KeyValue Cache pattern
Problem: Consider entity A with field codeName and A' with fields codeName, name. Between A and A' there is key-value enrichment for codeName-name using dictionary D. Map Data activity for 1000+ A records using D with 1000+ records is very slow due to sequential scan on D.codeName. For-each mapping uses non-indexed access to D.codeName.
Solution: Create Java Custom Function control with functions: addMapping(String container, String key, String value), String getMapping(String container, String key), clearMapping. They will use private final static ConcurrentHashMap<String,ConcurrentHashMap<String,String>> for storing key-value associations.
Solution: Create Java Custom Function control with functions: addMapping(String container, String key, String value), String getMapping(String container, String key), clearMapping. They will use private final static ConcurrentHashMap<String,ConcurrentHashMap<String,String>> for storing key-value associations.
poniedziałek, grudnia 09, 2013
Apache HTTPClient 4.3 + NTLM
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import org.apache.http.Header;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.NTCredentials;
import org.apache.http.client.AuthCache;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.entity.AbstractHttpEntity;
import org.apache.http.impl.DefaultConnectionReuseStrategy;
import org.apache.http.impl.client.BasicAuthCache;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.DefaultConnectionKeepAliveStrategy;
import org.apache.http.impl.client.DefaultServiceUnavailableRetryStrategy;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.message.BasicHeader;
public class HttpClientWrapper {
private static HttpClientBuilder cb = null;
public final static synchronized void initClientBuilder(int requestTimeout, int retryCount, int retryTimeout) {
if (cb==null) {
cb = HttpClientBuilder.create();
cb.setConnectionReuseStrategy(DefaultConnectionReuseStrategy.INSTANCE);
cb.setKeepAliveStrategy(DefaultConnectionKeepAliveStrategy.INSTANCE);
cb.setServiceUnavailableRetryStrategy(new DefaultServiceUnavailableRetryStrategy(retryCount, retryTimeout));
RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(requestTimeout)
.setConnectionRequestTimeout(requestTimeout).build();
cb.setDefaultRequestConfig(requestConfig);
}
}
private static HashMap<String,HttpClientContext> contextCache = new HashMap<String, HttpClientContext>();
private static HashMap<String,CloseableHttpClient> clientCache = new HashMap<String, CloseableHttpClient>();
public static synchronized void setAuthContext(String cookie, String user, String pass, String domain) {
if (contextCache.get(cookie) == null) {
CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(
new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT, AuthScope.ANY_REALM, "ntlm"),
new NTCredentials(user, pass, "localhost", domain));
AuthCache authCache = new BasicAuthCache();
HttpClientContext context = HttpClientContext.create();
context.setCredentialsProvider(credsProvider);
context.setAuthCache(authCache);
contextCache.put(cookie, context);
}
}
public static synchronized CloseableHttpClient getClient(String cookie) {
CloseableHttpClient cli = clientCache.get(cookie);
if (cli==null) {
cli = cb.build();
clientCache.put(cookie, cli);
}
return cli;
}
public final static String requestReply(String cookie, String fullUrl, final String verb, String payload, final String payloadType) throws ClientProtocolException, IOException {
CloseableHttpClient cli = getClient(cookie);
HttpUriRequest httpRequest = null;
if ("GET".equalsIgnoreCase(verb)) {
httpRequest = new HttpGet(fullUrl);
}
else {
HttpPost post = new HttpPost(fullUrl) {
@Override
public String getMethod() {
return verb;
}
};
if (payload != null) {
final byte[] content = payload.getBytes("UTF-8");
post.setEntity(new AbstractHttpEntity() {
@Override
public void writeTo(OutputStream outputstream) throws IOException {
outputstream.write(content);
}
@Override
public boolean isStreaming() {
return false;
}
@Override
public boolean isRepeatable() {
return false;
}
@Override
public long getContentLength() {
return content.length;
}
@Override
public Header getContentType() {
return new BasicHeader("Content-Type", payloadType);
}
@Override
public InputStream getContent() throws IOException, IllegalStateException {
return new ByteArrayInputStream(content);
}
});
}
httpRequest = post;
}
CloseableHttpResponse response = cli.execute(httpRequest, contextCache.get(cookie));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
response.getEntity().writeTo(baos);
return baos.toString("UTF-8");
}
public final static void main(String[] args) throws Exception, Exception {
initClientBuilder(60000, 3, 3000);
setAuthContext("GET", "jan.kowalski", "passw0rd", "ENTERPRISE");
System.out.println(requestReply("GET",
"https://crm-test/XRMServices/2011/OrganizationData.svc/AccountSet",
"GET", null, null)
);
}
}
Server certificate 33:65:50:08:79:ad:73:e2:30:b9:e0:1d:0d:7f:ac:91 rejected
Certyfikat Thawte DV SSL CA (36:12:22:96:c5:e3:38:a5:20:a1:d2:5f:4c:d7:09:54) wystawiony jest przez:
E = premium-server@thawte.com
CN = Thawte Premium Server CA
OU = Certification Services Division
O = Thawte Consulting cc
L = Cape Town
S = Western Cape
C = ZA
A ten z kolei przez:
CN = thawte Primary Root CA
OU = (c) 2006 thawte, Inc. - For authorized use only
OU = Certification Services Division
O = thawte, Inc.
C = US
Ten drugi jest w dwóch wersjach z tym samym DN ale o różnych numerach seryjnych:
34:4e:d5:57:20:d5:ed:ec:49:f4:2f:ce:37:db:2b:6d (self signed) i 33:65:50:08:79:ad:73:e2:30:b9:e0:1d:0d:7f:ac:91 (podpisany przez Thawte Premium Server CA).
Pierwsza wersja jest w zaufanych certyfikatach Windows, druga nie. Jakim cudem komunikacja SSL w Windows się waliduje względem złego certyfikatu nadrzędnego? Nie powinna. Tymczasem w Javie słusznie nie działa i trzeba zaimportować prawidłowy certyfikat.
E = premium-server@thawte.com
CN = Thawte Premium Server CA
OU = Certification Services Division
O = Thawte Consulting cc
L = Cape Town
S = Western Cape
C = ZA
A ten z kolei przez:
CN = thawte Primary Root CA
OU = (c) 2006 thawte, Inc. - For authorized use only
OU = Certification Services Division
O = thawte, Inc.
C = US
Ten drugi jest w dwóch wersjach z tym samym DN ale o różnych numerach seryjnych:
34:4e:d5:57:20:d5:ed:ec:49:f4:2f:ce:37:db:2b:6d (self signed) i 33:65:50:08:79:ad:73:e2:30:b9:e0:1d:0d:7f:ac:91 (podpisany przez Thawte Premium Server CA).
Pierwsza wersja jest w zaufanych certyfikatach Windows, druga nie. Jakim cudem komunikacja SSL w Windows się waliduje względem złego certyfikatu nadrzędnego? Nie powinna. Tymczasem w Javie słusznie nie działa i trzeba zaimportować prawidłowy certyfikat.
Kernel 3.8.13 od Oracle-a dla RHEL 6.5
http://public-yum.oracle.com/public-yum-ol6.repo
http://public-yum.oracle.com/repo/OracleLinux/OL6/UEKR3/latest/x86_64/
Btrfs send-receive wreszcie dostępne.
http://public-yum.oracle.com/repo/OracleLinux/OL6/UEKR3/latest/x86_64/
Btrfs send-receive wreszcie dostępne.
Ubuntu 13.10 sleep vs hibernation
vi /etc/pm/config.d/00-use-suspend-hybrid
--Insert--
if [ "$METHOD" = "suspend" ]; then
METHOD="hibernate"
fi
HIBERNATE_MODE=suspend
SLEEP_MODULE=uswsusp
PM_HIBERNATE_DELAY=210
HIBERNATE_RESUME_POST_VIDEO=yes
vi /etc/polkit-1/localauthority/50-local.d/com.ubuntu.enable-hibernate.pkla
--Edit--
[Re-enable hibernate by default]
Identity=unix-user:*
Action=org.freedesktop.upower.hibernate
ResultActive=yes
--Insert--
if [ "$METHOD" = "suspend" ]; then
METHOD="hibernate"
fi
HIBERNATE_MODE=suspend
SLEEP_MODULE=uswsusp
PM_HIBERNATE_DELAY=210
HIBERNATE_RESUME_POST_VIDEO=yes
vi /etc/polkit-1/localauthority/50-local.d/com.ubuntu.enable-hibernate.pkla
--Edit--
[Re-enable hibernate by default]
Identity=unix-user:*
Action=org.freedesktop.upower.hibernate
ResultActive=yes
niedziela, grudnia 08, 2013
Jak działa kryzys
Zmniejszenie obrotów, pogorszenie płynności finansowej, a przez to zmniejszenie dostępności towarów i tak cyklicznie w dół. Dlatego ważne jest bieżące prowadzenie raportów i odpowiednie reagowanie. Jednak niektóre przedsięwzięcia daje się uratować.
W okresie największej świetności warszawski oddział Znaku mieścił się na Poznańskiej :) a kolejki na parterze były tak duże że trzeba było otworzyć dla klientów pierwsze piętro.
piątek, listopada 22, 2013
Promieniowanie kosmiczne i temperatura
Promieniowanie kosmiczne i temperatura mają wpływ na błędy w komórkach pamięci RAM i pamięci podręcznej procesora. Rzecz oczywista, teraz zmierzona.
Configure Tibco EMS provider for JBoss EAP 5.x
Put jms.jar and tibjms.jar to lib/endorsed.
Add into server/default/deploy/messaging/jms-ds.xml:
Write MDB:
import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.Message;
import javax.jms.MessageListener;
@MessageDriven(
activationConfig = {
@ActivationConfigProperty(propertyName = "destination", propertyValue = "testQueue"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "providerAdapterJNDI", propertyValue = "java:/DefaultEMSProvider"),
@ActivationConfigProperty(propertyName = "user", propertyValue = "user"),
@ActivationConfigProperty(propertyName = "password", propertyValue = "pass"),
@ActivationConfigProperty(propertyName = "DLQUser", propertyValue = "user"),
@ActivationConfigProperty(propertyName = "DLQPassword", propertyValue = "pass")
},
mappedName = "testQueue")
public class TestQueue implements MessageListener {
public TestQueue() {}
public void onMessage(Message message) {
System.out.println(message+"");
}
}
/** see org.jboss.resource.adapter.jms.inflow.JmsActivationSpec for all properties **/
And you've got it:
10:39:37,064 INFO [STDOUT] TextMessage={ Header={ JMSMessageID={ID:EMS-TEST.D965 28614F411790C:7} JMSDestination={Queue[testQueue]} JMSReplyTo={null} JMSDelivery Mode={PERSISTENT} JMSRedelivered={false} JMSCorrelationID={null} JMSType={null} JMSTimestamp={Fri Nov 22 10:39:36 CET 2013} JMSExpiration={0} JMSPriority={4} } Properties={ } Text={2013-11-22T10:39:37.028+01:00} }
Add into server/default/deploy/messaging/jms-ds.xml:
<mbean code="org.jboss.jms.jndi.JMSProviderLoader"
name="jboss.messaging:service=JMSProviderLoader,name=EMSProvider">
<attribute name="ProviderName">DefaultEMSProvider</attribute>
<attribute name="ProviderAdapterClass">org.jboss.jms.jndi.JNDIProviderAdapter</attribute>
<attribute name="FactoryRef">ConnectionFactory</attribute>
<attribute name="QueueFactoryRef">QueueConnectionFactory</attribute>
<attribute name="TopicFactoryRef">TopicConnectionFactory</attribute>
<attribute name="Properties">
java.naming.security.principal=admin
java.naming.security.credentials=Adm1n
java.naming.factory.initial=com.tibco.tibjms.naming.TibjmsInitialContextFactory
java.naming.factory.url.pkgs=com.tibco.tibjms.naming
java.naming.provider.url=tibjmsnaming://tb-dev2.dc2:7222
</attribute>
</mbean>
In tibemsadmin execute:create queue queue/DLQ create queue testQueue commit
Write MDB:
import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.Message;
import javax.jms.MessageListener;
@MessageDriven(
activationConfig = {
@ActivationConfigProperty(propertyName = "destination", propertyValue = "testQueue"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "providerAdapterJNDI", propertyValue = "java:/DefaultEMSProvider"),
@ActivationConfigProperty(propertyName = "user", propertyValue = "user"),
@ActivationConfigProperty(propertyName = "password", propertyValue = "pass"),
@ActivationConfigProperty(propertyName = "DLQUser", propertyValue = "user"),
@ActivationConfigProperty(propertyName = "DLQPassword", propertyValue = "pass")
},
mappedName = "testQueue")
public class TestQueue implements MessageListener {
public TestQueue() {}
public void onMessage(Message message) {
System.out.println(message+"");
}
}
/** see org.jboss.resource.adapter.jms.inflow.JmsActivationSpec for all properties **/
And you've got it:
10:39:37,064 INFO [STDOUT] TextMessage={ Header={ JMSMessageID={ID:EMS-TEST.D965 28614F411790C:7} JMSDestination={Queue[testQueue]} JMSReplyTo={null} JMSDelivery Mode={PERSISTENT} JMSRedelivered={false} JMSCorrelationID={null} JMSType={null} JMSTimestamp={Fri Nov 22 10:39:36 CET 2013} JMSExpiration={0} JMSPriority={4} } Properties={ } Text={2013-11-22T10:39:37.028+01:00} }
środa, listopada 20, 2013
Standalone JBoss Messaging JMS client with EAP 5.1.0 jars
commons-logging.jar
concurrent.jar
javassist.jar
jboss-aop-client.jar
jboss-client.jar
jboss-common-core.jar
jboss-ha-client.jar
jboss-ha-legacy-client.jar
jboss-javaee.jar
jboss-logging-jdk.jar
jboss-logging-log4j.jar
jboss-logging-spi.jar
jboss-main-client.jar
jboss-messaging-client.jar
jboss-metadata.jar
jboss-mdr.jar
jboss-remoting.jar
jboss-security-spi.jar
jboss-serialization.jar
jbossall-client.jar
jbosscx-client.jar
jbossjts-integration.jar
jbossjts.jar
jnp-client.jar
log4j.jar
logkit.jar
policy.jar
scout.jar
slf4j-api.jar
slf4j-jboss-logging.jar
trove.jar
concurrent.jar
javassist.jar
jboss-aop-client.jar
jboss-client.jar
jboss-common-core.jar
jboss-ha-client.jar
jboss-ha-legacy-client.jar
jboss-javaee.jar
jboss-logging-jdk.jar
jboss-logging-log4j.jar
jboss-logging-spi.jar
jboss-main-client.jar
jboss-messaging-client.jar
jboss-metadata.jar
jboss-mdr.jar
jboss-remoting.jar
jboss-security-spi.jar
jboss-serialization.jar
jbossall-client.jar
jbosscx-client.jar
jbossjts-integration.jar
jbossjts.jar
jnp-client.jar
log4j.jar
logkit.jar
policy.jar
scout.jar
slf4j-api.jar
slf4j-jboss-logging.jar
trove.jar
wtorek, listopada 19, 2013
TDI can measure XML tree creation times per node
New build of TDI in profiler mode measures creation times per XML tree node. Presented time is an average with nanosecond accuracy, with given nesting level in XML tree.
środa, listopada 06, 2013
Tibco flow tuning for high throughput
The most important settings are RAM, MaxJobs/FlowLimit, Engine.ThreadCount, HTTP Response Thread Pool size (type can be set to single for savings) and JMS MaxSessions (in client ack mode).
MaxSessions and MaxJobs should be equal per process, the same is true for correlated MaxJobs and HTTP Thread Pool. Engine.ThreadCount should be 10-20% greater than sum of FlowLimits, HTTP threads. When components are stacked every following should have FlowLimit exceeding previous by at least 20% (consider BW engine restarts and backlog). You can decrease RAM usage by tweaking XML namespaces usage (prefixes defined in process namespace registry should match prefixes used in activities, to get rid of redundant namespace declarations on every node you can 'exclude prefixes' from XML roots).
Interesting case is with huge volume of large messages (~1000 per second, > 100KB) handled by different processes of various duration: resource utilization is high and every process starter is flow controlled. When flow control kicks in it closes JMS receiver, it usually has got prefetched messages inside a session and all work for fetching them is lost and repeated by other receiver. Now, the default receive time unit is 1 second, which is not enough under heavy load. So, we've got the same messages floating and stuck between server and BW process. Overall performance is degraded very much. The solution is to disable prefetch and increase JMS receiver timeout. Described case can be traced with 'show consumers full' within tibemsadmin console.
MaxSessions and MaxJobs should be equal per process, the same is true for correlated MaxJobs and HTTP Thread Pool. Engine.ThreadCount should be 10-20% greater than sum of FlowLimits, HTTP threads. When components are stacked every following should have FlowLimit exceeding previous by at least 20% (consider BW engine restarts and backlog). You can decrease RAM usage by tweaking XML namespaces usage (prefixes defined in process namespace registry should match prefixes used in activities, to get rid of redundant namespace declarations on every node you can 'exclude prefixes' from XML roots).
Interesting case is with huge volume of large messages (~1000 per second, > 100KB) handled by different processes of various duration: resource utilization is high and every process starter is flow controlled. When flow control kicks in it closes JMS receiver, it usually has got prefetched messages inside a session and all work for fetching them is lost and repeated by other receiver. Now, the default receive time unit is 1 second, which is not enough under heavy load. So, we've got the same messages floating and stuck between server and BW process. Overall performance is degraded very much. The solution is to disable prefetch and increase JMS receiver timeout. Described case can be traced with 'show consumers full' within tibemsadmin console.
wtorek, października 29, 2013
A jednak bug w oprogramowaniu Toyoty
Trzy lata temu przewidywałem, że problemy z pedałem przyśpieszenia w Toyotach to błąd w firmware. Niestety z teoretycznymi liczbami miałem rację. Strach jeździć z takim oprogramowaniem silnika. Ze skryptu sądowego: Toyota Camry 2005 poruszająca się z prędkością ok. 100 km/h potrzebuje mniej więcej 3,5 metra na zresetowanie komputera (125 milisekund). Żeby zresetować komputer bez watchdoga trzeba wyłączyć i włączyć stacyjkę, a w przypadku keyless-go wyjąć pilota z samochodu (sic!!!), włożyć go ponownie i nacisnąć przycisk startu. 11 000 zmiennych globalnych, funkcje o cyklomatycznej złożoności powyżej 50, stosowanie rekurencji przy za małym stosie. Żeby zadziałał watchdog od hamowania trzeba najpierw zdjąć nogę z hamulca a potem wcisnąć mocno. Watchdogi w ESP nie monitorują głównego procesora.
sobota, października 26, 2013
Ambassada
Na koniec w paru momentach widzimy Warszawę jaką mogła by być, z nowoczesnymi wieżowcami, z żydowskimi handlarzami na ulicach, Marszałkowską bazującą na zabudowanie z początku dwudziestego wieku. Ile to miasto straciło kulturowo i cywilizacyjnie przez taki a nie inny bieg historii.
Darski gra trochę drętwo, ale z subtelnym kawałkiem na gitarze jest mocny. Więckiewicz jest jak zawsze dobry.
Darski gra trochę drętwo, ale z subtelnym kawałkiem na gitarze jest mocny. Więckiewicz jest jak zawsze dobry.
poniedziałek, października 21, 2013
Kwarcogranit
Kwarcogranit albo kwarc techniczny to materiał powstały przez uwibrowanie pod wysokim ciśnieniem i temperaturą zmielonego kwarcu, żywic, pigmentów i innych dodatków odpowiadających za unikalność wzoru (np. odłami szkła, lustra, porcelany itp.). Z płyt produktu można tworzyć blaty kuchenne, podłogi, elewacje. Produceni oferują też tworzenie prawie dowolnych obiektów z tego materiału np. zlewozmywaków - te są szlifowane wraz z blatem pod kątem 45 stopi i spajane silikonem tworząc ładną jednolitą powierzchnię kuchenną. Kwarcogranit przy średnio intensywnym użytkowaniu odporny jest na zadrapania. W przypadku ustawicznego rzucania/drapania sztućcami, stawiania gorącej patelni lepiej sprawdzi się zlew standardowy podwieszany ceramiczny/granitowy np. Franke, Blanco. Kwarcogranit (Technistone, Silestone) nie jest odporny na nagłą zmianę temperatury i w miejscu zestawienia gorącej blachy do pieczenia może popękać. Nie zacznie się jednak topić/zmieniać kształt jak konglomerat z rudą aluminium i akrylem (Corian, Staron, Kerrock).
czwartek, października 17, 2013
NestedJarClassLoader
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.InputStream;
import java.net.JarURLConnection;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.HashMap;
import java.util.jar.JarFile;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class NestedJarClassLoader extends URLClassLoader {
private HashMap jarCache = new HashMap();
@Override
public InputStream getResourceAsStream(String s) {
byte[] data = jarCache.get(s);
if (data==null)
data = jarCache.get("/"+s);
return (data!=null) ? new ByteArrayInputStream(data) : null;
}
@Override
public URL findResource(String name) {
return null; // not supported
}
@Override
public Class loadClass(String s) throws ClassNotFoundException {
byte[] bc = jarCache.get(s+".class");
if (bc!=null)
return super.defineClass(s, bc, 0, bc.length);
return super.loadClass(s);
}
public NestedJarClassLoader(URL url) throws Exception {
super(new URL[] {}, NestedJarClassLoader.class.getClassLoader());
String sURL = url.toString();
String u = url.toString().substring(4);
String name = new File(u.substring(9)).getName();
URL firstJarUrl = new URL(sURL.substring(0, sURL.lastIndexOf("/")+1));
JarFile jf = ((JarURLConnection)firstJarUrl.openConnection()).getJarFile();
InputStream is = jf.getInputStream(jf.getEntry(name));
byte[] binaryJar = new byte[is.available()];
/* read through compressed stream is tricky */
int n = 0;
int cnt = 0;
do {
n = is.read(binaryJar, cnt, binaryJar.length - cnt);
if (n>0)
cnt += n;
}
while (n > 0);
ZipInputStream zis = new ZipInputStream(new ByteArrayInputStream(binaryJar));
ZipEntry ze = null;
while ((ze = zis.getNextEntry()) != null) {
byte[] buff = new byte[4096];
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int s = 0;
do {
s = zis.read(buff);
if (s>0)
baos.write(buff, 0, s);
}
while (s > 0);
if (baos.size() > 0 && ze.getName() != null) {
jarCache.put(ze.getName(), baos.toByteArray());
if (ze.getName().endsWith(".class")) {
String className = ze.getName().replace('$', '.').replace('/', '.');
jarCache.put(className, baos.toByteArray());
}
}
}
}
public static void main(String[] args) throws Exception {
URL url = new URL("jar:file:C://tibco/bw/5.10/hotfix/lib/tibcoverage.jar!/tdi.jar");
NestedJarClassLoader ucl = new NestedJarClassLoader(url);
ucl.loadClass("tdi.com.tibco.pe.Logger");
}
}
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.InputStream;
import java.net.JarURLConnection;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.HashMap;
import java.util.jar.JarFile;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class NestedJarClassLoader extends URLClassLoader {
private HashMap
@Override
public InputStream getResourceAsStream(String s) {
byte[] data = jarCache.get(s);
if (data==null)
data = jarCache.get("/"+s);
return (data!=null) ? new ByteArrayInputStream(data) : null;
}
@Override
public URL findResource(String name) {
return null; // not supported
}
@Override
public Class loadClass(String s) throws ClassNotFoundException {
byte[] bc = jarCache.get(s+".class");
if (bc!=null)
return super.defineClass(s, bc, 0, bc.length);
return super.loadClass(s);
}
public NestedJarClassLoader(URL url) throws Exception {
super(new URL[] {}, NestedJarClassLoader.class.getClassLoader());
String sURL = url.toString();
String u = url.toString().substring(4);
String name = new File(u.substring(9)).getName();
URL firstJarUrl = new URL(sURL.substring(0, sURL.lastIndexOf("/")+1));
JarFile jf = ((JarURLConnection)firstJarUrl.openConnection()).getJarFile();
InputStream is = jf.getInputStream(jf.getEntry(name));
byte[] binaryJar = new byte[is.available()];
/* read through compressed stream is tricky */
int n = 0;
int cnt = 0;
do {
n = is.read(binaryJar, cnt, binaryJar.length - cnt);
if (n>0)
cnt += n;
}
while (n > 0);
ZipInputStream zis = new ZipInputStream(new ByteArrayInputStream(binaryJar));
ZipEntry ze = null;
while ((ze = zis.getNextEntry()) != null) {
byte[] buff = new byte[4096];
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int s = 0;
do {
s = zis.read(buff);
if (s>0)
baos.write(buff, 0, s);
}
while (s > 0);
if (baos.size() > 0 && ze.getName() != null) {
jarCache.put(ze.getName(), baos.toByteArray());
if (ze.getName().endsWith(".class")) {
String className = ze.getName().replace('$', '.').replace('/', '.');
jarCache.put(className, baos.toByteArray());
}
}
}
}
public static void main(String[] args) throws Exception {
URL url = new URL("jar:file:C://tibco/bw/5.10/hotfix/lib/tibcoverage.jar!/tdi.jar");
NestedJarClassLoader ucl = new NestedJarClassLoader(url);
ucl.loadClass("tdi.com.tibco.pe.Logger");
}
}
poniedziałek, października 07, 2013
Beckers
Testery Beckers można kupić w Leroy Merlin Strefa Wnętrza (Ostrobramska) - 4,95 zł za 50 ml. Teoretyczna wydajność to 0,75m^2. Przy surowej ścianie spada do 0,3m^2. Na zdjęciu pistacja, aqua i lawenda. Światło wpadające do pomieszczenia w różnych porach dnia i o różnej pogodzie ma inne temperatury barwowe - przykładowo: w ciepły dzień po południu do koloru ściany będzie dodawany beżowy i pistacja będzie miejscami wyglądać jak banan. Im mniej światła tym kolory farby są bardziej wyraziste - aqua i lavender bardziej przypominają zwykły niebieski i fioletowy.
Zarządzanie zasobami w projekcie
Przełączanie się między kontekstami/zadaniami jest kosztowne nie tylko w przypadku systemu operacyjnego ale też w przypadku pracujących ludzi. Jak zatem pogodzić N projektów i jednego pracownika? Jeden projekt na dzień - dana osoba jest przydzielona do projektu na 100% w ten sam cyklicznie powtarzający się dzień tygodnia np. poniedziałek. W innym projekcie uczestniczy we wtorki. Jeśli projekt jest ważny/priorytetowy to osoba jest przydzielona do niego w piątki i poniedziałki. Co jeśli nie można zebrać danego zespołu w dany dzień/spełnić warunków brzegowych niezbędnych do startu kolejnej iteracji? Ludzie czekają na zaistnienie sprzyjających okoliczności za sprawą kierownika projektu, a jeśli po dwóch godzinach stan się nie zmieni to przechodzą do swoich bieżących nieprojektowych zadań. Dzień taki z punktu widzenia kierownika projektu jest zmarnowany - z tak odebranej kary powinien wyciągnąć wnioski. Jeżeli nie starcza dni tygodnia do podziału, to w oczywisty sposób brakuje ludzi do wykonywania pracy.
piątek, września 13, 2013
Grails authentication using ActiveDirectory + remember me
// LDAP config
grails.plugins.springsecurity.ldap.context.managerDn = 'domain\\ldapbind'
grails.plugins.springsecurity.ldap.context.managerPassword = 'password'
grails.plugins.springsecurity.ldap.context.server = 'ldap://domain:389/'
grails.plugins.springsecurity.ldap.authorities.ignorePartialResultException = true
grails.plugins.springsecurity.ldap.search.base = 'dc=domain'
grails.plugins.springsecurity.ldap.search.filter="sAMAccountName={0}"
grails.plugins.springsecurity.ldap.search.searchSubtree = true
grails.plugins.springsecurity.ldap.auth.hideUserNotFoundExceptions = false
grails.plugins.springsecurity.ldap.search.attributesToReturn = ['mail', 'displayName', 'title']
grails.plugins.springsecurity.providerNames = ['rememberMeAuthenticationProvider', 'daoAuthenticationProvider', 'ldapAuthProvider', 'anonymousAuthenticationProvider']
grails.plugins.springsecurity.ldap.useRememberMe = false
grails.plugins.springsecurity.ldap.authorities.retrieveGroupRoles = true
grails.plugins.springsecurity.ldap.authorities.retrieveDatabaseRoles = true
grails.plugins.springsecurity.ldap.authorities.groupSearchBase ='dc=domain'
grails.plugins.springsecurity.ldap.authorities.groupSearchFilter = 'member={0}'
//grails.plugins.springsecurity.ldap.authorities.groupSearchFilter = '(member:1.2.840.113556.1.4.1941:={0})'
grails.plugins.springsecurity.rememberMe.persistent = true
grails.plugins.springsecurity.rememberMe.persistentToken.domainClassName = 'security.PersistentLogin'
grails.plugins.springsecurity.ldap.rememberMe.detailsManager.groupMemberAttributeName = 'member'
grails.plugins.springsecurity.ldap.rememberMe.detailsManager.groupSearchBase = 'dc=domain'
grails.plugins.springsecurity.ldap.rememberMe.usernameMapper.userDnBase = 'domain'
grails.plugins.springsecurity.ldap.rememberMe.usernameMapper.usernameAttribute = 'cn'
grails.plugins.springsecurity.ldap.rememberMe.detailsManager.attributesToRetrieve = null
//grails.plugins.springsecurity.ldap.context.baseEnvironmentProperties = [ 'java.naming.ldap.factory.socket' : //'org.springframework.ldap.extras.ad.access.TolerantSSLSocketFactory' ]
grails.plugins.springsecurity.ldap.authorities.clean.uppercase = true
grails.plugins.springsecurity.cacheUsers = true
grails.plugins.springsecurity.apf.continueChainBeforeSuccessfulAuthentication = false
grails.plugins.springsecurity.apf.allowSessionCreation = false
grails.plugins.springsecurity.useSessionFixationPrevention = true
grails.plugins.springsecurity.rememberMe.alwaysRemember = true
grails.plugins.springsecurity.rememberMe.persistent = true
grails.plugins.springsecurity.securityConfigType = "InterceptUrlMap"
grails.plugins.springsecurity.interceptUrlMap = [
'/user/**': ['ROLE_ADMIN'],
'/role/**': ['ROLE_ADMIN'],
'/registrationcode/**': ['ROLE_ADMIN'],
'/acl*/**': ['ROLE_ADMIN'],
'/securityinfo/usercache': ['ROLE_NO_ACCESS'],
'/security*/**': ['ROLE_ADMIN'],
'/processing*/**': ['ROLE_ADMIN'],
'/js/**': ['IS_AUTHENTICATED_ANONYMOUSLY'],
'/css/**': ['IS_AUTHENTICATED_ANONYMOUSLY'],
'/images/**': ['IS_AUTHENTICATED_ANONYMOUSLY'],
'/login/**': ['IS_AUTHENTICATED_ANONYMOUSLY'],
'/logout/**': ['IS_AUTHENTICATED_ANONYMOUSLY'],
'/*/**': ['IS_AUTHENTICATED_REMEMBERED']
]
grails.plugins.springsecurity.ldap.context.managerDn = 'domain\\ldapbind'
grails.plugins.springsecurity.ldap.context.managerPassword = 'password'
grails.plugins.springsecurity.ldap.context.server = 'ldap://domain:389/'
grails.plugins.springsecurity.ldap.authorities.ignorePartialResultException = true
grails.plugins.springsecurity.ldap.search.base = 'dc=domain'
grails.plugins.springsecurity.ldap.search.filter="sAMAccountName={0}"
grails.plugins.springsecurity.ldap.search.searchSubtree = true
grails.plugins.springsecurity.ldap.auth.hideUserNotFoundExceptions = false
grails.plugins.springsecurity.ldap.search.attributesToReturn = ['mail', 'displayName', 'title']
grails.plugins.springsecurity.providerNames = ['rememberMeAuthenticationProvider', 'daoAuthenticationProvider', 'ldapAuthProvider', 'anonymousAuthenticationProvider']
grails.plugins.springsecurity.ldap.useRememberMe = false
grails.plugins.springsecurity.ldap.authorities.retrieveGroupRoles = true
grails.plugins.springsecurity.ldap.authorities.retrieveDatabaseRoles = true
grails.plugins.springsecurity.ldap.authorities.groupSearchBase ='dc=domain'
grails.plugins.springsecurity.ldap.authorities.groupSearchFilter = 'member={0}'
//grails.plugins.springsecurity.ldap.authorities.groupSearchFilter = '(member:1.2.840.113556.1.4.1941:={0})'
grails.plugins.springsecurity.rememberMe.persistent = true
grails.plugins.springsecurity.rememberMe.persistentToken.domainClassName = 'security.PersistentLogin'
grails.plugins.springsecurity.ldap.rememberMe.detailsManager.groupMemberAttributeName = 'member'
grails.plugins.springsecurity.ldap.rememberMe.detailsManager.groupSearchBase = 'dc=domain'
grails.plugins.springsecurity.ldap.rememberMe.usernameMapper.userDnBase = 'domain'
grails.plugins.springsecurity.ldap.rememberMe.usernameMapper.usernameAttribute = 'cn'
grails.plugins.springsecurity.ldap.rememberMe.detailsManager.attributesToRetrieve = null
//grails.plugins.springsecurity.ldap.context.baseEnvironmentProperties = [ 'java.naming.ldap.factory.socket' : //'org.springframework.ldap.extras.ad.access.TolerantSSLSocketFactory' ]
grails.plugins.springsecurity.ldap.authorities.clean.uppercase = true
grails.plugins.springsecurity.cacheUsers = true
grails.plugins.springsecurity.apf.continueChainBeforeSuccessfulAuthentication = false
grails.plugins.springsecurity.apf.allowSessionCreation = false
grails.plugins.springsecurity.useSessionFixationPrevention = true
grails.plugins.springsecurity.rememberMe.alwaysRemember = true
grails.plugins.springsecurity.rememberMe.persistent = true
grails.plugins.springsecurity.securityConfigType = "InterceptUrlMap"
grails.plugins.springsecurity.interceptUrlMap = [
'/user/**': ['ROLE_ADMIN'],
'/role/**': ['ROLE_ADMIN'],
'/registrationcode/**': ['ROLE_ADMIN'],
'/acl*/**': ['ROLE_ADMIN'],
'/securityinfo/usercache': ['ROLE_NO_ACCESS'],
'/security*/**': ['ROLE_ADMIN'],
'/processing*/**': ['ROLE_ADMIN'],
'/js/**': ['IS_AUTHENTICATED_ANONYMOUSLY'],
'/css/**': ['IS_AUTHENTICATED_ANONYMOUSLY'],
'/images/**': ['IS_AUTHENTICATED_ANONYMOUSLY'],
'/login/**': ['IS_AUTHENTICATED_ANONYMOUSLY'],
'/logout/**': ['IS_AUTHENTICATED_ANONYMOUSLY'],
'/*/**': ['IS_AUTHENTICATED_REMEMBERED']
]
czwartek, września 12, 2013
Logowanie EAI
Logowanie EAI powinno być wieloaspektowe:
- wszystkie akcje w ramach jednego logicznego przepływu oznaczone tą samą instancją identyfikatora przepływu
- te same logicznie dane w ramach dowolnej akcji oznaczone tym samym użytecznym biznesowo identyfikatorem
- stan zakończenia procesu biznesowego: sukces, błąd biznesowy, błąd techniczny
- statystyki wydajnościowe liczone w czasie wykonania lub surowe dane przetwarzane i raportowane offline
- błędy analizowane w wąskim oknie czasowym raportowane w czasie zbliżonym do rzeczywistego, co pozwala na łatwe zauważenie awarii w powiązanych ze sobą komponentach
środa, września 11, 2013
Protesty w Warszawie
18 tys. ludzi. Władza ma ich gdzieś, napuszcza jednych na drugich, robiąc ze związkowców wroga klasowego. Ten rząd oszustów i magików od PR trzeba jak najszybciej wymienić.
Subskrybuj:
Posty (Atom)











































